Just chiming in for people finding this, more uses for string concatenation with a custom LTI value.
For example in order to make sure that the correct version of a user's email (for us this is what in shibboleth is eppn, or eduPersonPrincipalName) is passed no matter what, we add the custom value like this:
eppn=${User.username}@institution.edu
and then set the tool provider to use custom_eppn as the email address.
Note: This will pass all Test students and any other user account that doesn't have an sis_id as having an email address when they normally don't, i.e. test students would have an email address like c43bc4c8f7642ddaa4d92b9967d2af8c776c4221@institution.edu, and a non sis_account will be passed as canas_login@institution.edu
This can be avoided by instead using a formulation like
sis_eppn=${Canvas.user.sisSourceId}@institution.edu
However, this might have a stranger effect on LTI launches as all users with out an sisSourceId will be passed with custom_sis_eppn = ${Canvas.user.sisSourceId}@institution.edu, which might cause errors on the other side as ${Canvas.user.sisSourceId}@institution.edu is not a valid email adddress (and if the tool provider accepts it, all non-sis accounts might share an account on the Tool Provider's side, depending on how they implemented their LTI (for the many vendors who use email as their primary account id, this would definitely happen).
This seems to be a side effect of the the concatenation -- using a simple variable sub instead, i.e.
sis_user_id=$Canvas.user.sisSourceId
is passed as custom_sis_user_id="" for users without a sisSourceId.
MORE FUN
You can do multiple values in a single line, e.g.
tracking_code=${Canvas.account.sisSourceId}/${Canvas.account.name}