![如果参考标签中不存在前缀字符串,如何添加?](https://linux22.com/image/453447/%E5%A6%82%E6%9E%9C%E5%8F%82%E8%80%83%E6%A0%87%E7%AD%BE%E4%B8%AD%E4%B8%8D%E5%AD%98%E5%9C%A8%E5%89%8D%E7%BC%80%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%8C%E5%A6%82%E4%BD%95%E6%B7%BB%E5%8A%A0%EF%BC%9F.png)
我的论文需要一些乳胶帮助。因此,我有以下命令:
\newcommand{\refChap}[1]{Chap.~\ref{chap:#1}}
这使我能够使用以下方式引用我的文档的章节:
\refChap{first_work} % the 'chap:' part is added by the function
例如。我的论文中有很多这种引用。但是,有了我现在用来写作的 VSCode 中的自动完成功能,这样写会更方便:
\refChap{chap:first_work} % the 'chap:' part is added by me in the args
我可以进行查找和替换来修复整篇论文,将 chap: 添加到这些参考文献中。但同样的事情也适用于 fig、eqn 等。
我希望我可以修复 refChap 函数,使其无论是否使用 'chap:' 部分都可以工作。为此,我尝试了以下操作:
\newcommand{\prependChap}[1]{chap:\StrSubstitute{#1}{chap\:}{}}
如果尚未存在,则这将前置“chap:”。
然后:
\newcommand{\refChap}[1]{Chap.~\ref{\prependChap{#1}}}
但是,这会破坏 pdf 渲染,并且在我尝试使用时,chap: 会重复出现很多次。
我做错了什么?如果这是一个基本错误,请原谅,我是第一次编写自己的 latex 命令。顺便说一句,我知道,作为额外的复杂因素,章节标签包含下划线。但是,我也在没有下划线的章节名称上测试了这一点,但没有帮助。
答案1
LaTeX 扩展参数的方式相当复杂,这与其他编程语言非常不同,在其他编程语言中,表达式几乎可以出现在任何位置,并被求值,结果被用作另一个表达式的一部分。因此,通常最好保持宏的参数“干净”,并在参数之外进行处理。
在这种情况下,您可以检查参数是否以前缀 using 开头\IfBeginWith
,并在 True 情况下使用\ref
带有原始参数的语句,\ref
在 False 情况下使用另一个带有添加前缀的语句。
梅威瑟:
\documentclass{report}
\usepackage{xstring}
\newcommand{\refChap}[1]{%
\IfBeginWith{#1}{chap:}{%
Chap.~\ref{#1}}{%
Chap.~\ref{chap:#1}}%
}
\begin{document}
\chapter{First work}
\label{chap:first_work}
This is \refChap{first_work}, which is the same as \refChap{chap:first_work}.
\end{document}
结果: