LaTeX 自动避免重复内容
在编辑自动化文档时,很容易出现在文档多处提及相同内容的情况。例如,描述某具体设备的图片,在多个工艺中都会用到,而又无法确定工艺出现顺序,或者对于不同企业,工艺不尽相同。这时我们可能会希望,latex帮助我们保留第一次出现的图片,而不输出后出现的相同图片,并且维护所有对这张图片的引用。
要实现此功能,直觉地感到:
- 代码要能判断某个指令或标签是否已经被定义;
- 若已经定义,则不执行任何操作;
- 若未定义,则定义之,并输出内容。
在tex底层,存在一个识别指令名是否被定义的指令:\@ifundefined{指令名不带斜杠}{执行内容}
对于该指令,有两点需要注意:
- 指令的名称包含符号 @,需要在使用之前执行\makeatletter将其视为一般字符,在之后执行\makeatother恢复其为特殊符号;
- 第一个参数是不带斜杠的指令名,允许由其他宏指令组成。
而在已知一个要定义的名称,而这个名称需要由上下文决定的宏指令构成时,\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幅图片,每个段落引用各自的标签位置。
LaTeX 自动避免重复内容的更多相关文章
- 在CentOS 6.7中安装 latex2html, 实现 latex 自动转化为 word
由于latex文档生成的pdf不便于提供审阅和修改,亟需一个软件实现从latex向word文档的自动转换( 如何把Latex自动转为Word 介绍了由latex2html 可实现这个功能,这也是初衷) ...
- ASP.NET的SEO:使用.ashx文件——排除重复内容
本系列目录 不同的链接指向的页面如果具有大量相同的内容,这种现象就会被称为"重复内容",如果一个网站的重复内容很多,搜索引擎就会认为这个网站的价值不高.所以我们应尽量避免各种重复内 ...
- 如何给wordpress首页自动显示文章内容的第一个图片
敏捷个人手机应用中使用到的数据来源于wordpress中,因为自己写的页面,所以可以自己写代码获取文章内容的第一个图片作为文章缩略图来显示,这样用户看到首页时图文并茂,感觉会好一些. 现在后台简单的使 ...
- JS实现复制网页内容自动加入版权内容代码和原文链接
JS实现复制网页内容自动加入版权内容代码和原文链接 实现代码:在body内放入如下代码即可: <script type="text/javascript"> var S ...
- 页面滚动动态加载数据,页面下拉自动加载内容 jquery
<!DOCTYPE=html> <html> <head> < script src="js/jquery.js" type=" ...
- altium6.x中自动删除重复走线的位置
在protel 2004 DXP中,“自动删除走线”的位置就在"PCB Editor"的默认页面,非常好找. 但是升级到了altium 6.7,6.9之后,很多人就找不到这个了. ...
- JavaScript下拉框去除重复内容
下拉框去除重复内容 <script type="text/javascript" src="http://www.joleye.com/libraries/java ...
- oracle中的rowid--伪列-删除表中的重复内容-实用
1.rowid是一个伪列,是用来确保表中行的唯一性,它并不能指示出行的物理位置,但可以用来定位行. 2.rowid是存储在索引中的一组既定的值(当行确定后).我们可以像表中普通的列一样将它选出来. 3 ...
- Jquery页面滚动动态加载数据,页面下拉自动加载内容
<!DOCTYPE=html> <html> <head> <script src="js/jquery.js" type="t ...
随机推荐
- 使用CXF实现WebService
一.首先创建一个maven项目,引入相应的jar包 <?xml version="1.0" encoding="UTF-8"?> <proje ...
- 使用IDEA打包scala程序并在spark中运行
一.首先配置ssh无秘钥登陆, 先使用这条命令:ssh-keygen,然后敲三下回车: 然后使用cd .ssh进入 .ssh这个隐藏文件夹: 再创建一个文件夹authorized_keys,使用命令t ...
- canvas 使用图片跨域问题
项目中需要生成海报,使用了前端生成图片的插件,将背景图,详情图,以及部分的文字说明放在一块并且生成一张新的图片,大体看了一下源码是通过canvas来实现的,在本地的时候完全没有问题,提交到服务器之后就 ...
- 996工作制?不如花点时间学知识!北栀暗影教你如何用WordPress搭建专业网站
很多70后.80后小时候都看过这样一部动画片-<半夜鸡叫>.讲的是地主"周扒皮"为了长工们能多干些活,半夜三更起来学鸡叫让长工劳动(卖身契上规定:鸡叫就得起床干活劳动) ...
- 《机器学习基石》---VC维
1 VC维的定义 VC维其实就是第一个break point的之前的样本容量.标准定义是:对一个假设空间,如果存在N个样本能够被假设空间中的h按所有可能的2的N次方种形式分开,则称该假设空间能够把N个 ...
- .net软件开发脚本规范-JS标准
一. JS标准 新增页面表单检查方法名称固定为checkForm. 查询页面表单检查方法名称固定为checkSearchForm. 检查表单方法checkForm与checkSearchForm固定放 ...
- 记一次mysql数据库失而复得过程
背景: 由于是自己买的vps搭建的博客,用的是军哥的一键lnmp源码编译安装的,文章也就几篇,对备份并不太重视,想着等服务器快到期的时候备份一下不就行了. 后来在该服务器上测试lnmp分别编译编译安装 ...
- Gitment评论插件的使用
前言 继上一篇的 GitPages部署自己的网站 现在开始添加博客的评论插件Gitment.这里的话我是使用hexo添加gitment插件,如果不是使用hexo,请到官网指定这里. 开始 第一步 注册 ...
- ansible模块介绍之ios_facts
一.模块简介 收集运行IOS系统的(此处指思科的ios)的远端设备信息 二.模块参数 auth_pass #特权密码,如果参数authorize=no,则不会检索此密码,如果任务task不指定,则默认 ...
- Git revert -m
这其实是个非常简单的指令,甚至用AS,直接右键操作不需要两秒钟 但今天使用命令行的方式操作的时候居然发现了点不一样的地方: 如下我希望revert某个commit,找到了它的id,跑一下命令之后居然发 ...