对于具有相同结构但不同内容的众多表格、段落等,重复使用相同布局的最佳方法是什么?最好的方法是使用自定义命令/宏?
答案1
正如 David Carlisle 和 Leo Liu 已经指出的那样,如果您预计未来会花大量时间使用 LaTeX 撰写论文,那么创建自定义宏绝对是一个好主意,例如标准化论文的布局和其他与格式相关的问题。事实上,TeX 和 LaTeX 的设计非常适合实现这一点。
当然,没有单一的“最佳”方法来创建这样的宏集合。宏的存在是为了服务你的需求,对你有用的东西不一定对别人也有用(反之亦然)。不过我认为,确实有一些通用的指导原则适用:
- 假设您使用 LaTeX,您可能希望将宏收集到“样式文件”中,并将该文件存储在 TeX 目录树中的某个位置,以便在使用命令调用它时可以找到它
\usepackage
。 - 与任何计算机程序一样,使用很多评论在编写和/或修改宏时留下关于你的想法的路标。你可能完全理解现在您今天所做的工作,但几周或几个月后再回头看代码时,您会非常感激自己提供了丰富的注释。提供注释还可以大大简化跟踪和修复代码中任何错误的任务。
- 确定您总是(或几乎总是)倾向于为文档加载哪些 LaTeX 包。一些候选包可能是
amsmath
、eurosym
和calc
。如果有这样的包,您可能应该将它们加载到样式文件中。 - 将软件包结构化为一份独立的小文档。先写一个简介(可能仅包含评论),然后是与页面布局(可能使用软件包
geometry
)、目录格式(可能使用软件包tocloft
)、参考和引文格式(例如,您是否使用引文管理软件包,如natbib
?)、图形支持(graphicx
)、数字和科学单位的格式(例如,使用软件包siunitx
)、超链接和交叉引用(hyperref
和cleveref
)等相关的部分。 - 一致地格式化图形和表格是一项挑战,熟能生巧(或者至少非常好)。对于这两组对象,我给出的主要建议是(i)彻底熟悉各种表格环境的属性(仅举几例:、、、、、以及许多其他环境)
tabular
和(ii)制定一致的表格(和图形)布局风格并坚持下去。例如,标题应该始终位于相应tabular*
浮动的顶部tabularx
还是底部?两种方法都可以,但由您做出选择。有这样的软件包可以帮助您以一致的方式构建表格的创建。请务必弄清楚这些软件包的内置格式标准是否符合您的喜好,以及/或者您是否可以修改这些软件包的某些部分以满足您的需要。tabulary
longtable
ctable
另外,准备提供一些事前灵活性关于应该加载的 LaTeX 包以及应该由您的包执行的任何自定义代码。并非所有 LaTeX 包都应始终加载(请参阅下面的示例)。提前做好一些规划,只需设置一个选项即可禁用包的某些部分;这比逐个注释各种指令要容易得多,而且出错的可能性要小得多(我想这可能被称为一种“事后”灵活性)。
例如,假设您撰写的工作论文需要根据以下情况进行不同的格式设置:(i) 一次性提交给同事、合著者和其他人——在这种情况下,您可以完全实现您的个人风格偏好;(ii) 您所在大学部门的工作论文系列中的工作论文;以及 (iii) 学术期刊上的文章。您的部门和您提交论文的期刊几乎肯定有与格式相关事宜的“内部样式”。(希望这些样式已编写为 LaTeX 样式文件,供您下载和包含。)当然,您不希望您的软件包与您可能需要加载的其他样式文件发生冲突,以遵守您所在部门或期刊的格式要求。
为了处理这种相当常见的意外情况,将包裹的内容分成两个独立的部分会很有帮助:
一个部分应该包含与广义的格式问题相关的所有指令,例如页面大小(例如“A4”或“美国信函”大小)、边距宽度、行距、字体大小、字体、浮动上下的间距、各种节标题的样式等。
另一部分应包括所有宏和指令不是与格式问题有关。这些可能是您设置的专门数学宏、文档中经常出现的单词的连字符例外模式(例如,如果您引用名为的作者
Gottlieb
,您可能希望添加命令\hyphenation{Gott-lieb}
以避免看到名称被连字符为Got-tlieb
!),以及加载与图形支持、颜色、交叉引用和引文的超链接以及交叉引用本身相关的包的说明。通常,期刊和学术部门的格式要求不会为后一种类型的包指定任何特殊内容。
以这种方式(重新)组织包后,您可以定义 (i) 一个布尔“变量”,用于控制是否应执行包中与格式相关的部分(其默认值应为“true”),以及 (ii) 一个名为 的包选项,
noformattingcode
它将布尔变量的值更改为“false”。这可以按照以下方式完成:\newif\if@formattingcode\@formattingcodetrue \DeclareOption{noformattingcode}{\@formattingcodefalse} ... % various other option declarations, etc. \ProcessOptions\relax \if@formattingcode % if true, execute the following instructions until \fi % all stuff broadly related to formatting of document \fi ...
如果在加载包时设置该选项
noformattingcode
,则表示 LaTeX 跳过条件范围内的部分\if@formattingcode
。
TeXing 快乐!
答案2
一般而言,将宏和设置放在包中以便重复使用是一个好主意。这本质上是 TeX 作为宏语言的要点。
不过,需要考虑的一件事是,文档源将与哪些其他非 TeX 系统一起使用。TeX 本身(以及 e-tex、xetex、luatex 等扩展)的实现非常一致,任何 TeX 宏都可以在任何系统上运行。然而,越来越多的人将 TeX 源转换为其他格式。例如转换为 HTML 和电子书,或者 MathJax 在网页中动态解释类似 TeX 的标记。大多数这些系统都不是了解完整的 TeX 语言,因此你使用的越多有趣的定义中的特征越多,在非 TeX 系统中使用源就越困难。
一个极端的例子是纯 TeX 文件http://mirrors.ctan.org/macros/plain/contrib/misc/xii.tex 许多 TeX 到某些内容的翻译器根本无法理解该文件。(有些可以,例如 tex4ht 和 latexml。)
答案3
我不确定如何提供这些信息,但使用 Mico 的答案,我\if@
在本地包文件中设置了几个有条件调用包的包,但出现了编译错误LaTeX Error: \RequirePackage or \LoadClass in Options Section.
确切的 TeX 是这样的,用 pdfLaTeX 编译:
\ProvidesPackage{tablemwe}
\newif\if@formattingcode\@formattingcodetrue
\DeclareOption{noformattingcode}{\@formattingcodefalse}
\if@formattingcode % if true, execute the following instructions until \fi
\usepackage{tikz}
\fi
对于更有经验的用户来说,这可能很明显,但在包中声明选项后,您必须添加命令\ProcessOptions
。此外,您可以将\newif
and\DeclareOption
与实际\if
语句分开。与上述相同的示例已更正为如下所示:
\ProvidesPackage{tablemwe}
\newif\if@formattingcode\@formattingcodetrue
\DeclareOption{noformattingcode}{\@formattingcodefalse}
\ProcessOptions
% Other code can come here, calling packages, renew commands, etc.
\if@formattingcode % if true, execute the following instructions until \fi
\usepackage{tikz}
\fi