It seems that media9
requires babel
just to have available \defineshorthand
, which is used in the macro \mix@uribegin
, which has several lines such as
\defineshorthand{"}{\detokenize{"}}%
which is meant to say: if "
is active, redefine it to \detokenize{"}
. The same effect may be obtained by using a helper macro:
\def\neutralize#1{%
\begingroup\lccode`~=`#1\lowercase{\endgroup\def~}{\detokenize{#1}}}
and changing the line above into
\neutralize{"}
If an active "
is found, it will be changed into a detokenized "
.
In LaTeX3 parlance this might be
\group_begin:
\char_set_catcode_active:N \~
\cs_new:Npn \mix_neutralize_active_char:n #1
{
\group_begin:
\char_set_lccode:nn { `~ }{ `#1 }
\tl_to_lowercase:n { \group_end: \cs_set:Npn ~ }{\token_to_str:N #1}
}
\cs_new:Npn \mix_uribegin:
{
\group_begin:
\mix_neutralize_active_char:n {"}
\mix_neutralize_active_char:n {:}
\mix_neutralize_active_char:n {/}
\mix_neutralize_active_char:n {?}
\mix_neutralize_active_char:n {[}
\mix_neutralize_active_char:n {]}
\mix_neutralize_active_char:n {@}
\mix_neutralize_active_char:n {!}
\mix_neutralize_active_char:n {$}
\mix_neutralize_active_char:n {&}
\mix_neutralize_active_char:n {'}
\mix_neutralize_active_char:n {(}
\mix_neutralize_active_char:n {)}
\mix_neutralize_active_char:n {*}
\mix_neutralize_active_char:n {+}
\mix_neutralize_active_char:n {,}
\mix_neutralize_active_char:n {;}
\mix_neutralize_active_char:n {=}
\mix_neutralize_active_char:n {-}
\mix_neutralize_active_char:n {.}
\mix_neutralize_active_char:n {_}
\mix_neutralize_active_char:n {~}
\cs_set:Npn \% {\token_to_str:N \%}
\cs_set:Npn \# {\token_to_str:N \#}
}
\group_end:
\cs_set_eq:NN \mix_uriend: \group_end:
This should replace the definitions of \mix@uribegin
and \mix@uriend
; where these appear, they must be replaced by \mix_uribegin:
and \mix_uriend:
EDIT
Following Joseph Wright's suggestion, here's a shorter definition:
\group_begin:
\char_set_catcode_active:N \~
\cs_new:Npn \mix_uribegin:
{
\group_begin:
\tl_map_inline:nn {":/?[]@!$&'()*+,=-._~}
{
\group_begin:
\char_set_lccode:nn { `\~ }{ `##1 }
\tl_to_lowercase:n { \group_end: \cs_set:Npn ~ }{\token_to_str:N ##1}
}
\cs_set:Npn \% {\token_to_str:N \%}
\cs_set:Npn \# {\token_to_str:N \#}
}
\group_end:
\cs_set_eq:NN \mix_uriend: \group_end:
The principle is exactly the same, but the code is at least more elegant.
\defineshorthand
; I believe it can easily dispense with it.\defineshorthand
. Could we replace it with something home-made?