Como definir dois pontos ao usar ExplSyntax

Como definir dois pontos ao usar ExplSyntax

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:Ns estão realmente obscurecendo o que deveria ser um comando bem simples.

Responder1

Dentro de \ExplSyntaxOnpode :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 tlo \..._use:Nacessador 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 \hrefprecisa ter dois pontos de categoria 12, portanto, precisamos usá \c_colon_str-lo.

Responder2

O principal problema é que \hrefdeseja 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}

insira a descrição da imagem aqui

Não tenho certeza se você deseja o trailing /.

O que eu estou fazendo? Eu defino uma função genérica \ar_href:nnnque 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 à protconstante:

\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}

informação relacionada