我有一套工作文档,其中包含各种文件以完成它们。因此主文档可能显示如下:
\section{Section A}
\input{SectionText1}
\input{SectionText2}
\section{Section B}
\input{SectionText3}
我这样做的原因是,我可以更改单个主文件中的文本,然后简单地将它们插入到我尝试创建的不同文件中。因此,重要的“SectionText”在各个文档中是相同的。但是,我并不总是包含相同的子文件,我想添加交叉引用,如果我已包含带有标签的文件,它将自动包含在主文档中,但如果没有,则不会打印相关文本。
为此,我创建了一个新命令:
\newcommand{\condlab}[2]{\ifdefined\r@#1 #2 \else \fi}
我在文本中执行
\condlab{sec:Label}{The text I want to include}
这不管用。它总是包含文本,和它包括“@sec:Label”
如果我写
\ifdefined\mycommand Include \else Not this \fi
在具有已定义或未定义新命令的文本中,它会按预期工作。如果我尝试:
\ifdefined\r@sec:Label
我得到的结果与使用 newcommand 完全相同,这很合理。有什么建议吗?
答案1
可以使用以下方法测试宏是否存在
\ifcsname <csname>\endcsname
% <true> (\<csname> exists)
\else
% <false> (\<csname> does not exist)
\fi
这是简化的etoolbox
的\ifcsdef{<csname>}{<true>}{<false>}
:
\documentclass{article}
\usepackage{etoolbox}
\newcommand{\condlab}[2]{\ifcsdef{r@#1}{#2}{}}
\begin{document}
\section{A section}
\label{sec:label}
\condlab{sec:label}{This text will be included.}
\condlab{sec:label2}{This text won't be included.}
\end{document}
上述用法(即使有\ifcsname <csname>\endcsname
)避免使用\makeatletter
...\makeatother
因为控制序列是建而不是明确地表述为控制序列。