章节标题内的用户定义命令。涉及 xstring 和书签 (hyperref)

章节标题内的用户定义命令。涉及 xstring 和书签 (hyperref)

我正在尝试定义一个命令来“集中”某些部分的标题(这些标题在文档中的更多地方使用)。因此,我认为创建一个以数字作为参数(项目编号)的命令,该命令将返回该编号的标题文本,这将很有用。我一直工作正常,直到我记得将书签/添加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
}

然而我不推荐这个因为它会更容易受到错误输入的影响。

相关内容