LaTeX 自动避免重复内容

在编辑自动化文档时,很容易出现在文档多处提及相同内容的情况。例如,描述某具体设备的图片,在多个工艺中都会用到,而又无法确定工艺出现顺序,或者对于不同企业,工艺不尽相同。这时我们可能会希望,latex帮助我们保留第一次出现的图片,而不输出后出现的相同图片,并且维护所有对这张图片的引用。

要实现此功能,直觉地感到:

  1. 代码要能判断某个指令或标签是否已经被定义;
  2. 若已经定义,则不执行任何操作;
  3. 若未定义,则定义之,并输出内容。

在tex底层,存在一个识别指令名是否被定义的指令:\@ifundefined{指令名不带斜杠}{执行内容}

对于该指令,有两点需要注意:

  1. 指令的名称包含符号 @,需要在使用之前执行\makeatletter将其视为一般字符,在之后执行\makeatother恢复其为特殊符号;
  2. 第一个参数是不带斜杠的指令名,允许由其他宏指令组成。

而在已知一个要定义的名称,而这个名称需要由上下文决定的宏指令构成时,\newcommand就不适用了,因为它不支持从文本创建指令。此时需要tex的另一个指令:\@namedef{指令名不带斜杠}{执行内容}

对于该指令,也同样需要注意之前提到了两点注意事项。

下面给出一个tex文件片段:

复制代码
.......

\newcommand\UserDefinedVar{Once}

工艺1采用了设备A,见图\ref{Fig:DeviceA\UserDefinedVar}。

\makeatletter
\@ifundefined{CommandDeviceA\UserDefinedVar}{
	\begin{figure}[hbt]
	  \centering \small
	  \begin{tabular}{c}
	  \includegraphics[width=0.8\textwidth]{ImageDevA} \\
	  \end{tabular}
	  \caption{设备A示意图}\label{Fig:DeviceA\UserDefinedVar}
	\end{figure}
	\@namedef{CommandDeviceA\UserDefinedVar}{}
}
\makeatother

% \renewcommand\UserDefinedVar{Twice}

工艺2也采用了设备A,见图\ref{Fig:DeviceA\UserDefinedVar}。

\makeatletter
\@ifundefined{CommandDeviceA\UserDefinedVar}{
	\begin{figure}[hbt]
	  \centering \small
	  \begin{tabular}{c}
	  \includegraphics[width=0.8\textwidth]{ImageDevA} \\
	  \end{tabular}
	  \caption{设备A示意图}\label{Fig:DeviceA\UserDefinedVar}
	\end{figure}
	\@namedef{CommandDeviceA\UserDefinedVar}{}
}
\makeatother

% \renewcommand\UserDefinedVar{ThirdTime}

工艺3同样采用了设备A,见图\ref{Fig:DeviceA\UserDefinedVar}。

\makeatletter
\@ifundefined{CommandDeviceA\UserDefinedVar}{
	\begin{figure}[hbt]
	  \centering \small
	  \begin{tabular}{c}
	  \includegraphics[width=0.8\textwidth]{ImageDevA} \\
	  \end{tabular}
	  \caption{设备A示意图}\label{Fig:DeviceA\UserDefinedVar}
	\end{figure}
	\@namedef{CommandDeviceA\UserDefinedVar}{}
}
\makeatother

.......
复制代码

 

此片段在编译后,只会出现一幅图片,后两段的引用指向第一次出现的标签位置。

如果取消掉注释的两行,则用户变量在过程中变化,编译后会出现3幅图片,每个段落引用各自的标签位置。

posted @   崩溃侠  阅读(1134)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
友情链接: Heroius' Ideas 沈阳因斯福环保安全科技有限公司 东北大学工业爆炸防护研究所
点击右上角即可分享
微信分享提示