我希望标签由宏定义,其值取决于某些条件。目的是自动获取类型为fig:03
或fig:03+04
或 的标签fig:03+04+05
:
\documentclass{book}
\usepackage{graphicx}
\usepackage{lipsum}
\usepackage{ifthen}
\def\imga{03}
\def\imgb{04}
\def\imgc{}
\newcommand{\multipiclabel}{%
\imga%
\ifthenelse{\equal{\imgb}{}}{}{+}\imgb%
\ifthenelse{\equal{\imgc}{}}{}{+}\imgc%
}
\begin{document}
\lipsum[1]
\begin{figure*}
\centering
\includegraphics[width=0.8\linewidth]{example-image-a}
\caption{Caption / \protect\multipiclabel}
\label{fig:\multipiclabel}% this gives error
% \label{fig:\imga+\imgb+\imgc}% this works but may define label with unwanted trailing +
\end{figure*}
\lipsum[2]
\end{document}
但上述 MWE 无法编译。
有没有办法通过包含条件的宏来定义标签?
答案1
应该\multipiclabel
使用可扩展的原始条件来定义:
\def\multipiclabel{\imga
\ifx\imgb\empty\else +\imgb\fi \ifx\imgc\empty\else +\imgc\fi}
答案2
假设在//#
的定义中没有使用,您可以这样做:\imga
\imgb
\imgc
\documentclass{book}
\usepackage{graphicx}
\usepackage{lipsum}
\def\imga{03}
\def\imgb{04}
\def\imgc{}
\begingroup
\catcode`\#=8
\csname @firstofone\endcsname{%
\endgroup
\newcommand*{\multipiclabel}{%
\imga\if#\imgb#\else+\imgb\fi\if#\imgc#\else+\imgc\fi
}%
}%
\begin{document}
\lipsum[1]
\begin{figure*}
\centering
\includegraphics[width=0.8\linewidth]{example-image-a}
\caption{Caption / \protect\multipiclabel}
\label{fig:\multipiclabel}%
\end{figure*}
\lipsum[2]
\end{document}
.aux 文件是:
\relax
\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces Caption / \multipiclabel }}{1}{}\protected@file@percent }
\newlabel{fig:03+04}{{1}{1}}
\gdef \@abspage@last{1}
从 -entry 中可以看出\newlabel
,\label
-command 的参数计算结果为fig:03+04
。
如果有 ε-TeX 扩展可用:
\newcommand*{\multipiclabel}{%
\imga
\ifcat$\detokenize\expandafter{\imgb}$\else+\imgb\fi
\ifcat$\detokenize\expandafter{\imgc}$\else+\imgc\fi
}%
此定义可以在/ /#
的定义中使用——如果您确实要使用它们,则需要在这些定义中将它们加倍。\imga
\imgb
\imgc
虽然我实际上\ifx
更喜欢,但我决定用\if
或来进行测试\ifcat
,因为\ifx..\empty
它依赖于\imgb
/\imgc
总是被定义为“短”宏,如\empty
。我是一个悲观主义者:有一天,有人读了那些关于 LaTeX 的众多“介绍”之一,其中毫无理由地被告知永远不要使用,\def
但总是使用 LaTeX 的\newcommand
/\renewcommand
可能不会使用 TeX\def
而是使用 LaTeX \renewcommand
(*
后面没有)来定义\imgb
/\imgc
具有这些是 -macros 的副作用\long
。然后我们得到另一个模式问题“为什么它不起作用”......