Cómo establecer dos puntos al usar ExplSyntax

Cómo establecer dos puntos al usar ExplSyntax

No puedo creer que sea la primera persona en preguntar esto, pero ¿hay una mejor manera de establecer dos puntos literales ( :) dentro de la sintaxis Expl que \str_use:N\c_colon_str? Esto es bastante complicado para cosas como escribir una URL. Por ejemplo, estoy escribiendo un comando para imprimir un enlace a una determinada página en mi servidor de ejemplos, y ahora mismo se define así:

\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 estos \str_use:Nmensajes realmente oscurecen lo que en realidad debería ser un comando bastante simple.

Respuesta1

\ExplSyntaxOnEl interior de :se puede usar directamente para generar algo, como cualquier otra letra, siempre y cuando no necesites que tenga la categoría 12 y la categoría 11 también estaría bien. Solo tienes que asegurarte de que no sea así. "toca" el nombre de una macro, para que puedas usarla \c_app_proto_str :pero no \c_app_proto_str:.

Además, para las variables stry el descriptor de acceso no es estrictamente necesario y puede omitirlo.tl\..._use:N

Por lo tanto, su fragmento de código se puede acortar a

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

Gracias a Ulrike Fischer por señalar que el primer argumento de \hrefdebe tener dos puntos de categoría 12, por lo que debemos usarlo \c_colon_strallí.

Respuesta2

El principal problema es que \hrefquiere ver un token de carácter explícito :del código de categoría 12, para poder escribir el enlace correcto en el archivo PDF, aislando el protocolo del resto.

Puedes hacerlo en tres pasos.

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

ingrese la descripción de la imagen aquí

No estoy seguro de que quieras el seguimiento /.

¿Qué estoy haciendo? Defino una \ar_href:nnnfunción genérica que puedes usar también en diferentes contextos (para otros protocolos, por ejemplo) y una variante de la misma que toma las constantes de cadena como argumentos.

Debido al estado peculiar de los dos puntos, es mejor dar un paso más, por lo que esta función en realidad llama a otro, donde el primer argumento, a través de una variante, proporcionará a los dos puntos el código de categoría correcto.

Sería mucho más fácil si agregas los dos puntos a la 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}

información relacionada