
Não acredito que sou a primeira pessoa a perguntar isso, mas existe uma maneira melhor de definir dois pontos literais ( :
) na sintaxe Expl do que \str_use:N\c_colon_str
? Isso é muito complicado para coisas como escrever um URL. Por exemplo, estou escrevendo um comando para imprimir um link para uma determinada página no meu servidor de exemplos, e agora isso está definido assim:
\NewDocumentCommand \server { m }
{ \href { \str_use:N \c_app_proto_str \str_use:N \c_colon_str // \str_use:N \c_app_host_str / #1 / }
{ \str_use:N \c_app_proto_str \str_use:N \c_colon_str // \linebreak[2]
\str_use:N \c_app_host_str / \linebreak[2] #1 / } }
Todos esses \str_use:N
s estão realmente obscurecendo o que deveria ser um comando bem simples.
Responder1
Dentro de \ExplSyntaxOn
pode :
ser usado diretamente para gerar algo, assim como qualquer outra letra, desde que você realmente não precise dela para ter a categoria 12 e a categoria 11 também seria adequada. "toque" em um nome de macro, para que você possa usar, \c_app_proto_str :
mas não \c_app_proto_str:
.
Além disso, para variáveis str
e tl
o \..._use:N
acessador não é estritamente necessário e você pode omiti-lo.
Seu snippet de código pode, portanto, ser abreviado para
\NewDocumentCommand \server { m }
{ \href { \c_app_proto_str \c_colon_str // \c_app_host_str / #1 / }
{ \c_app_proto_str :// \linebreak[2]
\c_app_host_str / \linebreak[2] #1 / } }
Obrigado a Ulrike Fischer por apontar que o primeiro argumento de \href
precisa ter dois pontos de categoria 12, portanto, precisamos usá \c_colon_str
-lo.
Responder2
O principal problema é que \href
deseja ver um token de caractere explícito :
do código de categoria 12, para escrever o link correto no arquivo PDF, isolando o protocolo dos demais.
Você pode fazer isso em três etapas.
\documentclass{article}
\usepackage{hyperref}
\ExplSyntaxOn
\NewDocumentCommand \server { m }
{
\ar_href:VVn \c_app_proto_str \c_app_host_str { #1 }
}
\cs_new_protected:Nn \ar_href:nnn
{% we need one more technical step for the colon
\__ar_href:Vnnn \c_colon_str { #1 } { #2 } { #3 }
}
\cs_new_protected:Nn \__ar_href:nnnn
{
\href { #2 #1 // #3 / #4 / }
{ #2 #1 // \linebreak[2] #3 / \linebreak[2] #4 / }
}
\cs_generate_variant:Nn \__ar_href:nnnn { V }
\cs_generate_variant:Nn \ar_href:nnn { VV }
\str_const:Nn \c_app_proto_str { https }
\str_const:Nn \c_app_host_str { example.com }
\ExplSyntaxOff
\begin{document}
\server{whatever}
\end{document}
Não tenho certeza se você deseja o trailing /
.
O que eu estou fazendo? Eu defino uma função genérica \ar_href:nnn
que você pode usar também em diferentes contextos (para outros protocolos, por exemplo) e uma variante dela que usa as constantes de string como argumentos.
Devido ao estado peculiar dos dois pontos, uma etapa adicional é melhor, então esta função na verdade chama outra, onde o primeiro argumento, por meio de uma variante, fornecerá aos dois pontos o código de categoria correto.
Seria muito mais fácil se você adicionasse dois pontos à prot
constante:
\documentclass{article}
\usepackage{hyperref}
\ExplSyntaxOn
\NewDocumentCommand \server { m }
{
\ar_href:VVn \c_app_proto_str \c_app_host_str { #1 }
}
\cs_new_protected:Nn \ar_href:nnn
{
\href { #1 // #2 / #3 / }
{ #1 // \linebreak[2] #2 / \linebreak[2] #3 / }
}
\cs_generate_variant:Nn \ar_href:nnn { VV }
\str_const:Nn \c_app_proto_str { https: }
\str_const:Nn \c_app_host_str { example.com }
\ExplSyntaxOff
\begin{document}
\server{whatever}
\end{document}