组织序言的最佳实践

组织序言的最佳实践

我正在整理一份大型文档,但我的序言笨拙且杂乱无章。按什么顺序加载包才合理?显然,hyperref除了必须放在后面的东西外,放在最后hyperref。我倾向于先加载字体包,因为它们看起来像是一个巨大的全局变化。我应该围绕哪些其他类别安排我的序言?还有其他加载顺序很重要的情况吗?我是否应该将其他命令放在与它们相关的包附近?例如,我是否应该将参考书目格式化命令放在我的\usepackage{biblatex}调用附近?

答案1

如果你想了解序言中的事情是如何纠缠在一起的,可以看看全面的 LaTeX 符号列表。它可能不完全是意大利面条式代码,但肯定可以归类为代码汤!

所以你说得对,你需要制定一个策略,并在文档开发早期就开始着手实施。以下提示来自我自己的工作流程和观察。

早期,当我开始使用 LaTeX 时,我意识到使用大量宏和包来改变 LaTeX 最初设置的几乎每个参数的外观后book.cls,我最好开发自己的类,这是我的第一个建议。

1.考虑开发您自己的类或包来保存您的更改。

只需单击save as按钮即可保存基类.dtx文件及其.ins文件。它将帮助您开始文学编程老实说,你花不了超过一两个小时就能搞清楚这一切是如何运作的。doc第一次使用时,你可能会感到困惑,但最终你会习惯这些惯例。这种方法的另一个优点是,在开始编写新文档时,你会发现在周一、周三和周四,你会希望你的文档看起来是这个样子,而在一周中的其他日子,你会希望它看起来是另一个样子。通过编写你的理由使用文学编程,它可以帮助您理清您的想法。

2. 让软件包和相关命令彼此靠近

对于较小的更改,即编写简短的包,要么使用 doc/docstrip 系统,要么如果您很着急,只需使用该包filecontents并在开发文档时即时编写它们。这往往会删除序言中的大量代码和注释行。我通常将所有与数学相关的宏放在一个名为的包中moremaths

% MATHEMATICS
\usepackage{amsfonts}
\usepackage{amsmath}[2000/07/18] %% Displayed equations
\let\equation\gather                          %% See tabu and hyperref docs
\let\endequation\endgather
\usepackage{amssymb}[2002/01/22] %% and additional symbols
\usepackage{amsfonts}
\usepackage{xfrac}
\usepackage{stmaryrd}
\usepackage{mathtools}
\usepackage{eucal} 

同样地,对于表格

%% Tables
%%  TABLES
\RequirePackage{array}
\RequirePackage{booktabs}
\RequirePackage{longtable}
\RequirePackage{tabularx}
\RequirePackage{dcolumn}
\RequirePackage{multirow}
%% Set some local commands and colors
\RequirePackage{colortbl}              % for colored table cells
\definecolor{green}{rgb}{0.1,0.1,0.1}
\newcommand{\done}{\cellcolor[gray]{0.9}done}  %{0.9}for done tables
%
%

3. 将序言分成几个标题,例如typography、、、等graphicsmathssectioning

如果您不开发自己的类并使用任何主要类(例如Koma或 )memoir,您会发现这些类通常针对每种可能的变化都有自己的配置命令;将所有相关命令分成几部分会有所帮助。如果部分变大,即如果您有太多部分,typography请将代码保存在包中并将其命名为moretypographymoremaths等。同样,如果前言变大,请质疑您自己的类的必要性。

4. 在自己的包中存在有问题的包设置,例如,sethyperefsetlistings包等。

有些包很难设置,如果它们在某些包之前或之后加载,可能会给您带来问题(请参阅哪些包应该在 hyperref 之后加载而不是之前加载?)。其他则需要一些复杂而冗长的设置。同样,如果您处理的是长文档,则可能需要将这些设置更改为小包。如果您确定了错误来源,最好保存和恢复命令,而不是移动它们。例如,该verse包给我带来了宏问题theHpoemline,我通常只将其与以下宏一起加载。

\let\oldH\theHpoemline
\let\theHpoemline\undefined

有很多类似的技术全面的 LaTeX 符号列表,序言,值得一读。

答案2

正如您已经观察到的,加载hyperref应该在序言的最后阶段进行。(但是,如果您加载cleveref,您可能已经知道应该加载 hyperref)有关包加载顺序的更多信息,请参见问题“哪些包应该在 hyperref 之后加载而不是之前加载?”

在不知道您的文档内容的情况下,我认为不可能就文档序言的组织/结构给出非常具体的建议。因此,以下评论和注释有点笼统。

  • 您可能希望将整个前言内容放入一个.sty名为的文件中,作为主文档实际前言中的唯一指令seamus-preamble-package进行加载。(当然,此文件需要位于 TeX 实现搜索的目录中。)如果没有其他操作,将前言内容放入文件中可以让您免于提供所有这些...指令。\usepackage{seamus-preamble-package}.sty.sty\makeatletter\makeatother

  • 计算机代码冗长且笨重并不等同于效率低下或不必要的复杂。如果您的文档冗长且复杂,那么前言可能没有必要简短。不过,请检查是否存在根本不需要加载的包,是否使用不需要的选项调用了某些包,或者是否存在一些可以执行当前在前言中费力编码的一些任务的包。

  • 一个通用的建议(我认为不仅适用于组织序言)是自由使用注释和空格。这样,如果您或其他人稍后需要更改序言中的内容,就可以减少浪费时间弄清楚发生了什么以及可能需要更改什么。

  • 根据序言的复杂程度,编写一个小型目录作为序言结构的“指南”可能是有意义的。这个指南可以简单到只是提供一份在序言中处理的任务组的简单列表。例如,该列表可能包含以下内容:

    • 定义正文中的页面布局 - 包括分节标题的外观、文本块的宽度和高度、行距、页眉和页脚行、页码的位置和格式
    • 选择字体和字体相关功能
    • 组织目录页的布局
    • 组织附录标题的外观
    • 组织参考书目和引用方法
    • 加载与数学相关的包,定义专门的数学相关命令
    • 配置浮动相关事项 - 包括标题的外观和与浮动位置相关的全部参数
    • 解决所有其他不完全属于其他类别的任务。例如,将某些单词添加到连字例外列表中,加载允许您排版符号的包euro
    • 加载与超引用和其他交叉引用任务相关的包
  • 特别是如果您决定按照前面的要点中概述的主题来组织序言,那么将与特定任务相关的那些说明(例如,通过创建参考书目biblatex,或通过设置目录的样式tocloft)放在靠近加载相关包的命令的地方是有意义的。

  • 另一个建议,可能更有争议:你可以加载那些可以调用的包没有通过一条\usepackage指令设置任何特殊选项。

    • 正如@MichaelPalmer 在他的评论中所指出的,这种方法的一个变体是使用一条\usepackage语句,但为每个要加载的包指定一行。这让读者清楚地看到正在加载的内容,并且还提供了一种在每行相关代码上添加简短注释的方法。

答案3

加载大量软件包(或大型软件包,如 TikZ)的前言确实会减慢您的工作流程。TeX 支持格式 (.fmt) 文件,这些文件以序列化形式存储 TeX 数据结构。TeX 可以重新加载它们并从处理给定文档时停止的地方继续。通过创建格式文件,您可以避免每次构建文档时重新加载软件包。

创建格式文件需要多个步骤(我pdflatex在 TeXLive 2011 中使用):

  1. 将你的序言从文档(我将其称为doc.tex)移至其自己的文件中,包括\documentclass声明。将新文件命名为preamble.tex
  2. 在底部添加一个定义preamble.tex,表明它已被加载:\def\preambleloaded{}

  3. 将以下行放在preamble.tex:的最开始处%&pdflatex

    这可确保您的前言加载 LaTeX 源。如果没有它,下一步将失败。preamble.tex应该看起来像这样:

    %&pdflatex
    \documentclass{...}
    ... 
    \def\preambleloaded{}
    %% end of preamble.tex
    
  4. pdflatex使用-ini转储格式文件的选项运行:“ pdflatex -ini preamble \dump”。

  5. 将以下行添加到doc.tex:的顶部%&preamble

    此行确保您的前言格式文件将被加载。

  6. 现在我们需要确保在格式文件不存在时doc.tex输入preamble.tex。代替您移动到的所有代码,添加此测试,该测试仅在未定义时preamble.tex加载:preamble.texpreambleloaded

    \ifx\preambleloaded\undefined
       \input{preamble}
    \fi
    

    \begin{document}应该紧接着上面的测试。开头doc.tex应该是这样的:

    %&preamble
    \ifx\preambleloaded\undefined
       \input{preamble}
    \fi
    \begin{document}
    ...
    

完成上述操作后,您可以doc.tex随意修改,TeXpreamble.tex在构建时不会重新解析doc.tex。如果您更改了preamble.tex,只需重新运行pdflatex -ini命令即可重建格式文件。

这是一个很好的插入点Chris Monson 的 LaTeX Makefile,它将根据需要重新制作您的格式文件(即,在更改时make doc重建)。preamble.fmtpreamble.tex

答案4

这里有一个细节,对大多数人来说可能微不足道,但有一次我却犯了错误:把元数据\author,,)\title\date接近尾声你的序言。像titling依赖该信息的软件包(这是我失败的地方)你可能想把它们 hyperref不过,这样它就可以pdfusetitle通过选项自动收集数据

我只是习惯把它放在序言的第一位,因为这些命令是我在 LaTeX 中学到的第一批东西,所以它们留在顶部,而其他东西(= 包)则添加在底部。

另一个细节在大多数情况下并不重要,但仍然可以轻松完成:fontenc 所有包裹都正在加载字体以避免加载 Computer Modern 系列中任何不必要的 T1 编码字体。

相关内容