从列表中删除宏,例如 LOF

从列表中删除宏,例如 LOF

当定义新的章节或为图片或表格添加标题时,通常会复制该命令的内容。一个版本直接放入文本中,即作为标题或图形下方,另一个版本通常出现在列表中,即在目录或图片列表中。

如果两个版本应该有所不同,则必要的命令有一个可选参数,可用于为这些列表定义与普通文本不同的内容,例如\section[list content]{text content}。有时我在文本内容中使用宏,这不应该是列表内容的一部分。当然,\section[content]{\mymacro content}当我在自己的文档中执行此操作时,我总是可以复制文本内容并添加列表内容而无需宏,例如。但由于我需要包的功能,因此用户不能(也不应该)被迫自己做这项工作,因此我想知道如何避免这种情况。

hyperref 包有一个宏\texorpdfstring,它通过将不同的内容放入 PDF 的内容表(书签)而不是文件中来解决非常相似的问题。还有一个宏pdfstringdefDisableCommands,它提供了从内容中删除宏的可能性。重新定义所有\sectioncaption命令以(本地)重新定义\mymacro为空宏可能不太实用,因为命令太多了。这个问题的好的解决方案是什么样的?是否已经有一个包或命令可以从此类列表中删除宏?

动机:我想避免宏被执行两次。我还想避免在下次运行期间加载辅助文件时执行宏。我认为,如果宏没有出现在.aux.lof.toc等文件中,那么解决方案是正确的。

答案1

在此处输入图片描述

\documentclass{article}

\makeatletter
\def\vanishprotect{\ifx\protect\@typeset@protect
\expandafter\@firstofone\else
\expandafter\@gobble\fi}
\makeatother

\def\mymacro{\vanishprotect{HELLO }}


\begin{document}
\tableofcontents

\section{\mymacro xxx}
...
\section{\mymacro xxx}
...

\end{document}

相关内容