[英]Latex: \newcommand interpret # symbol problem
我定义了一个新命令
\newcommand{\test}[1]{\href{https://github.com/microsoft/vscode/blob/main/package.json#1}{#1}}
当我按如下方式使用它时:
\test{#L4}
url 将被解释为:
https://github.com/microsoft/vscode/blob/main/package.json##L4
url 中有一个额外的#
,这是意料之外的。 我真正想要的是:
https://github.com/microsoft/vscode/blob/main/package.json#L4
这意味着 package.json 代码的第 4 行
解决问题的最简单但不那么优雅的方法如下。
\test{\#L4}
但是如果我复制的 url 部分中出现了_
等其他特殊字符怎么办? 纠正这些无意义的语法错误很无聊。
有没有更优雅的方法来解决问题? 我想要的是将纯文本(url 的一部分)复制到 latex 代码中,并且不需要额外的工作,例如在#
之前添加\
转义字符和其他特殊字符。
我想要的是将纯文本(url 的一部分)复制到 latex 代码中,并且不需要额外的工作,例如在 # 之前添加 \ 转义字符和其他特殊字符。
恐怕这需要额外的努力,因为在 LaTeX 中, #
被用作宏的参数。 您可以重新定义类别,当#
被消耗时,恢复其原始含义。
我有另一个基于expl3
的解决方案,我在其中保存主地址并创建带有附加部分的链接。 请看下面的小演示
\documentclass{article}
\usepackage[colorlinks]{hyperref}
\usepackage[margin=1in]{geometry} % To fit long links without breaks
\ExplSyntaxOn
\str_new:N \l__xaddr_main_str
\str_new:N \l__xaddr_show_str
\cs_new:Npn \combine_addr:n #1 {
\str_set:Nn \l_tmpa_str {#1}
\str_concat:NNN \l__xaddr_show_str \l__xaddr_main_str \l_tmpa_str
}
\NewDocumentCommand\xsetmainaddr{v}{
\str_set:Nn \l__xaddr_main_str {#1}}
\NewDocumentCommand\xdisplay{v}{%
\str_if_empty:NF \l__xaddr_main_str {
\combine_addr:n {#1}
\str_use:N \l__xaddr_show_str
}}
\NewDocumentCommand\xhref{vv}{%
\str_if_empty:NF \l__xaddr_main_str {
\combine_addr:n {#1}
\href{\l__xaddr_show_str}{#2}
}}
\ExplSyntaxOff
\setlength\parindent{0pt} % To fit long links without breaks
\begin{document}
\xhref{#L4}{GitHub} % Nothing to display. The main address is not defined.
\xsetmainaddr{https://github.com/microsoft/vscode/blob/main/package.json}
\par\xdisplay{#L4} % Display the full address including #L4
\par\xdisplay{#something_else%20here} % all characters accepted
\par\xhref{#L4}{GitHub} % Generates link: <address>#L4
\bigskip
\xsetmainaddr{http://www.google.com} % New address
\par\xhref{}{Google} % Generates link
\end{document}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.