当定义新的章节或为图片或表格添加标题时,通常会复制该命令的内容。一个版本直接放入文本中,即作为标题或图形下方,另一个版本通常出现在列表中,即在目录或图片列表中。
如果两个版本应该有所不同,则必要的命令有一个可选参数,可用于为这些列表定义与普通文本不同的内容,例如\section[list content]{text content}
。有时我在文本内容中使用宏,这不应该是列表内容的一部分。当然,\section[content]{\mymacro content}
当我在自己的文档中执行此操作时,我总是可以复制文本内容并添加列表内容而无需宏,例如。但由于我需要包的功能,因此用户不能(也不应该)被迫自己做这项工作,因此我想知道如何避免这种情况。
hyperref 包有一个宏\texorpdfstring
,它通过将不同的内容放入 PDF 的内容表(书签)而不是文件中来解决非常相似的问题。还有一个宏pdfstringdefDisableCommands
,它提供了从内容中删除宏的可能性。重新定义所有\section
和caption
命令以(本地)重新定义\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}