使用 ExplSyntax 时如何设置冒号

使用 ExplSyntax 时如何设置冒号

我不敢相信我是第一个问这个问题的人,但是有没有比 更好的方法来:在 Expl 语法中设置文字冒号 ( ) \str_use:N\c_colon_str?这对于编写 URL 之类的事情来说非常笨拙。例如,我正在编写一个命令来打印出我的示例服务器上某个页面的链接,现在它的定义如下:

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

所有这些\str_use:N确实掩盖了本来应该非常简单的命令。

答案1

\ExplSyntaxOn在里面:可以直接用来输出一些东西,就像任何其他字母一样,只要你不真正需要它有类别 12 和类别 11 也可以。你只需要确保它不会“触及”宏名,所以你可以使用\c_app_proto_str :但不能\c_app_proto_str:

此外,对于strtl变量来说\..._use:N,访问器并不是严格必要的,您可以省略它。

因此,您的代码片段可以缩短为

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

感谢 Ulrike Fischer 指出 的第一个参数\href需要有一个 12 类冒号,因此我们需要\c_colon_str在那里使用。

答案2

主要问题是\href需要看到类别代码 12 的明确字符标记:,以便在 PDF 文件中写入正确的链接,将协议与其余部分隔离开来。

您可以分三个步骤完成。

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

在此处输入图片描述

我不确定您是否想要尾随的/

我在做什么?我定义了一个通用\ar_href:nnn函数,您也可以在不同的上下文中使用它(例如,对于其他协议),以及一个以字符串常量作为参数的变体。

由于冒号的特殊状态,最好再进一步,因此该函数实际上调用另一个函数,其中第一个参数通过变体为冒号提供正确的类别代码。

如果将冒号添加到常量中,就会容易得多prot

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

相关内容