我不敢相信我是第一个问这个问题的人,但是有没有比 更好的方法来:
在 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:
。
此外,对于str
和tl
变量来说\..._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}