我正在尝试定义一个命令来“集中”某些部分的标题(这些标题在文档中的更多地方使用)。因此,我认为创建一个以数字作为参数(项目编号)的命令,该命令将返回该编号的标题文本,这将很有用。我一直工作正常,直到我记得将书签/添加hyperref
到组合中。
以下是 MWE 对此情况的描述:
\documentclass[a4paper,oneside,titlepage,12pt]{article}
\usepackage{xstring} %To test conditions with strings and such.
\usepackage{bookmark}
%If the argument is 1 it will return "y ¡Ya no puedo más!", etc.
\newcommand{\UnasPalabras}[1]{
\IfEqCase{#1}{%
{1}{y ¡Ya no puedo más!}%
{2}{Siempre se repite esta misma historia.}%
{3}{¡Melancolíiiiiiiía!}%
}[Horror!]%
}
\begin{document}
\tableofcontents
\section{Siempre me voy a enamorar}
De quien de mi no se enamora,\newline
es por eso que mi alma llora.
\section{\protect\UnasPalabras{1}}
\UnasPalabras{1}
\UnasPalabras{2}
\end{document}
有什么方法可以避免这种情况并使用一个命令,当在部分标题中使用时,该命令将返回与数字相关联的字符串hyperref
?
答案1
包中的大多数命令xstring
在仅扩展的上下文中不起作用。其中一个例子是章节标题的 PDF 书签。
如果仅测试整数,则xstring
可以使用xparse
和\int_case:nnF
expl3
函数。 的第一个参数\int_case:nnF
是要测试的数字,第二个参数是,如对\IfEqCase
列表中的{<number>}{<text>}
,第三个参数用于在未找到匹配项的情况下使用。
expl3
\str_case:nn(T|F|TF)
如果您的输入不只是整数,它还具有针对字符串的函数。此命令也是可扩展的。
我定义了一个包装器\IntCasennF
,\int_case:nnF
以便您可以在非expl3
代码中使用它。这是一个工作示例:
\documentclass[a4paper,oneside,titlepage,12pt]{article}
\usepackage{xparse} % To do all kinds of cool macros in TeX
\ExplSyntaxOn
\NewExpandableDocumentCommand \IntCasennF { m m m }
{ \int_case:nnF {#1} {#2} {#3} }
\ExplSyntaxOff
\usepackage{bookmark}
%If the argument is 1 it will return "y ¡Ya no puedo más!", etc.
\newcommand{\UnasPalabras}[1]{%
\IntCasennF{#1}{%
{1}{y ¡Ya no puedo más!}%
{2}{Siempre se repite esta misma historia.}%
{3}{¡Melancolíiiiiiiía!}%
}{Horror!}%
}
\begin{document}
\tableofcontents
\section{Siempre me voy a enamorar}
De quien de mi no se enamora,\newline
es por eso que mi alma llora.
\section{\protect\UnasPalabras{1}}
\UnasPalabras{1}
\UnasPalabras{2}
\end{document}
一种更强力(并且更不稳健)的方法是使用 TeX\ifcase
原语:
\newcommand{\UnasPalabras}[1]{%
\ifcase\numexpr#1\relax
\or y ¡Ya no puedo más!%
\or Siempre se repite esta misma historia.%
\or ¡Melancolíiiiiiiía!%
\else Horror!%
\fi
}
然而我不推荐这个因为它会更容易受到错误输入的影响。