如何根据标签是否定义在主体中插入文本

如何根据标签是否定义在主体中插入文本

我有一套工作文档,其中包含各种文件以完成它们。因此主文档可能显示如下:

\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因为控制序列是而不是明确地表述为控制序列。

相关内容