模块化 LaTeX 文档前言和类文件

模块化 LaTeX 文档前言和类文件

我一直在争论是否要问这个问题,因为我不想提出一个过于宽泛而无法回答的问题,或者仅仅基于观点的问题,但我认为可能有一些技术可以充分回答这个问题。

我正在寻找可以用来组织代码的方法,以简化或清理我的类文件或文档序言。下面是我的 cls 文件中的一些示例片段和组织。我试图将尽可能多的自定义和配置保留在 cls 文件中,而不是复杂的文档序言中,因为我希望 cls 文件是一个模板,在不断变化的包含序言的主文件中只需要最少的自定义。

因为它全部在我的 cls 文件中(我担心它的长度会变得无法管理)。当我分支到一个新项目时,我希望能够从同一个类文件开始,然后只删除和修改相关内容。主要动机之一是当某些全局概念总是需要更新时防止重复,而其他自定义肯定需要独立。因为\input{}似乎非常方便我使用它../..来导航到我希望存储单个配置文件的位置(跨驱动器除外)

我的文档序言中的几个方面之一是新命令、更新命令的配置,以及为词汇表加载和配置的文件,它们都加载在不同的文件中

\input{../src/private/my-newcommands}
\input{../src/private/config-glossary}  % Glossaries must be loaded before amsmath

那么使用这个概念可以将 cls 文件模块化和分隔开吗?

我已经创建了一些(我所描述的),其中包含针对常见任务(如数学、字体、页眉/页脚、标题、参考书目、格式修改等)的特定包加载和修改。但是,当传输一些变量定义、命令、环境和包(如 hyperref、cleveref、amsmath 等)到使用 cls 文件调用或位于 cls 文件内config files的离散 tex 文件中时,它们似乎不起作用。inputinclude

我无法为此提供 MWE,因为根据我放入这些外部 tex 文件中的内容,它似乎无法重现。例如,使用 sty 文件抓取时,颜色定义和包含工作正常,\input{} 是否应改为使用 sty 文件来实现这一点?

由于 Linux 上的 tex 安装在 cls 或 sty 文件的位置上有不同的规则,我将详细说明这个问题是针对 Windows 上的 MikTex 提出的,但我当然愿意听取有关 Linux 上并行组织结构的评论。出于兴趣,我的 cls 文件变得如此复杂的原因之一是我的文档必须与和xelatex兼容tex4ht

组织示例-我无法保证其中任何一个都会运行,因为我没有出于这个目的修剪此文件,只是尝试包含一些我保留在 cls 文件中的内容示例:

    %_________________________________________________________________________________________________________________________________________
    %
    % C L A S S   F I L E   S E T T I N G S    
    %_________________________________________________________________________________________________________________________________________

    \NeedsTeXFormat{LaTeX2e}
    \ProvidesClass{EngBird_Template}[2013/10/01 

    %http://tex.stackexchange.com/questions/24542/create-list-of-all-external-files-used-by-master-latex-document
    %\RequirePackage{snapshot}


    \LoadClass[12pt, twoside, letterpaper]{report}  %oneside

    %\RequirePackage{standalone}
    \RequirePackage{letltxmacro}
    %\RequirePackage{Sweave}
%
%_________________________________________________________________________________________________________________________________________

% TODO List
% Try an organize in small modular components
% Fix bolds in section hierarchy titles   
%==========================================================================================================================================
% PACKAGES REQUIRED FOR CONFIGURING REPORT  - PAGE MARGINS AND LINE SPACING
%==========================================================================================================================================
%
    \RequirePackage[letterpaper,includehead,
        left=3.25cm,right=2.54cm,top=2.54cm,
        headheight=1.5cm,headheight=0.0cm,
        bottom=2.54cm,footskip=1.0cm
        %hmargin=3cm,vmargin=3.75cm %only used to get rid of a overfull \hbox warning.
        ]{geometry}

    \RequirePackage{parskip}
    \RequirePackage{setspace}

    % CONFIGURE PAGE SPACING AND HYPHEN RESTRICTION CRITERION   
    \pagestyle{plain} % options: empty , plain , fancy
    \onehalfspacing
    \righthyphenmin=6
    \lefthyphenmin=6

    %http://tex.stackexchange.com/questions/11707/how-to-force-output-to-a-left-or-right-page
    %\cleardoublepage
    \RequirePackage{emptypage}  %http://tex.stackexchange.com/questions/21629/avoiding-page-numbers-in-empty-pages
        \newcommand*{\cleartoleftpage}{%
          \clearpage
            \if@twoside
            \ifodd\c@page
              \hbox{}\newpage
              \if@twocolumn
                \hbox{}\newpage
              \fi
            \fi
          \fi
        }
%
%_________________________________________________________________________________________________________________________________________


%=========================================================================================================================================
% PACKAGES REQUIRED CREATING CUSTOM COLORS
%=========================================================================================================================================

    \ifdefined\HCode
    %   \RequirePackage[html]{tex4ht}
        \RequirePackage[dvips]{xcolor}
    \else
        \RequirePackage{xcolor}%color %\PassOptionsToPackage{dvipsnames}{xcolor}
    \fi


    \definecolor{Crimson}{rgb}{0.6471, 0.1098, 0.1882}
    \definecolor{chaptergrey}{rgb}{0.6,0,0}
    \definecolor{halfgray}{gray}{0.55} % chapter numbers will be semi transparent .5 .55 .6 .0
    \definecolor{webgreen}{rgb}{0,.5,0}
    \definecolor{webbrown}{rgb}{.6,0,0}
    \definecolor{Maroon}{cmyk}{0, 0.87, 0.68, 0.32}
    \definecolor{RoyalBlue}{cmyk}{1, 0.50, 0, 0}
    \definecolor{Black}{cmyk}{0, 0, 0, 0}
%_________________________________________________________________________________________________________________________________________
%=========================================================================================================================================
%   SNIPPETS FROM http://zoonek.free.fr/LaTeX/ TO IMPROVE FORMATTING AND APPEARENCE  
%   See also ftp://ftp.tex.ac.uk/tex-archive/documentation/MemoirChapStyles/MemoirChapStyles.pdf
%   http://tex.stackexchange.com/questions/73421/how-to-create-specific-chapter-style-in-book-documentclass
%=========================================================================================================================================

%http://zoonek.free.fr/LaTeX/LaTeX_samples_chapter/0.html
\def\thickhrulefill{\leavevmode \leaders \hrule height 1ex  \hfill \kern \z@}

\def\@makechapterhead#1{%
    %\vspace*{50\p@}%
    %\vspace*{6\p@}%
    {\parindent \z@ \centering \reset@font
        \singlespacing
        \thickhrulefill\quad
        \scshape \@chapapp{} \thechapter
        \quad \thickhrulefill
        \par\nobreak
        \vspace*{6\p@}%
        \interlinepenalty\@M
        \hrule
        \vspace*{6\p@}%
        %\fontsize{19}{6}
        \Large 
        \bfseries #1\par\nobreak
        \par
        \vspace*{6\p@}%
        \hrule
        \vskip 20\p@
        %\vskip 100\p@
    }}

    \def\@makeschapterhead#1{%
        %\vspace*{50\p@}%
        % \vspace*{6\p@}%
        {\parindent \z@ \centering \reset@font
            \singlespacing
            \thickhrulefill
            \par\nobreak
            \vspace*{6\p@}%
            \interlinepenalty\@M
            \hrule
            \vspace*{6\p@}%
            %\fontsize{19}{6}
            \Large 
            \bfseries #1\par\nobreak
            \par
            \vspace*{6\p@}%
            \hrule
            \vskip 20\p@
            %\vskip 100\p@
        }}

% some definitions
\def\year#1{\gdef\@year{#1}}                    % specified in coverpage.tex
\def\month#1{\gdef\@month{#1}}              % specified in coverpage.tex

\newcommand{\maketitlepage}
{ 
    \singlespacing
    \thispagestyle{empty}
    \vspace*{\fill} \vspace{2cm} \begin{center}
        \Huge \textcolor{Crimson}{\textit{\MyTitle}} \normalsize \\ \sc \vspace{2cm}
        \vspace*{1.0cm}
        \normalsize
        by \\
        \vspace*{1.0cm}
        \large {\textit{\@author}} \normalsize \\ \sc \vspace{1cm}

        \normalsize \vspace*{2.0cm}

        etc \\

    \end{center} \vspace*{\fill}
}
%=========================================================================================================================================

%=========================================================================================================================================
% Special einvironment modifications
%=========================================================================================================================================

%http://tex.stackexchange.com/questions/17887/prevent-abstract-environment-to-reset-pagenumbering
% either use notitlepage in the \LoadClass or this
\renewenvironment{abstract}{%
  \if@twocolumn
    \section*{\abstractname}%
  \else
    %\small
    \begin{center}%
      {\bfseries \abstractname\vspace{-.5em}\vspace{\z@}}%
    \end{center}%
    \quotation
  \fi}
  {\if@twocolumn\else\endquotation\fi}

%_________________________________________________________________________________________________________________________________________


%=========================================================================================================================================
%  E Q U A T I O N  C A P T I O N  S E T U P 
%=========================================================================================================================================

\DeclareCaptionType{mycapequ}[][List of equations]
\captionsetup[mycapequ]{labelformat=empty}

该类文件由主 Latex 文档设置加载,如下所示:

%=============================================================================
%   P R E A M B L E
%=============================================================================
%______________________________________________________________________________________
%
% Setup the document class and enable a package to read preamble and files externally    %______________________________________________________________________________________
\documentclass{EngBird_Template}  

%----------------------------------------------------------------------
% Create a listing in the log of all files needed to process this document
\listfiles
\synctex=1 % turn synctex on automatically to sync between pdf viewer
%\setupbackend[export=yes]  % should be using with ConTeXt 
%\setupbackend     [export=example.xml, css=example.css]
%----------------------------------------------------------------------

\input{../src/private/my-newcommands} 
\input{../src/private/config-glossary}  % Glossaries must be loaded before amsmath

\renewcommand{\bibname}{References}   %\nocite{*}       % list all refs in database, cited or not

\begin{document}
    \ifdefined\HCode    \renewcommand{\textregistered}{\special{t4ht@+\string&{35}xAE{59}}x}    \else   \fi
    \input{../src/logical_contents}
\end{document}

更新

我认为值得一提的是,这个问题的模块化精神可以应用于texmf网络计算时代的目录结构解决方法。像我这样的人使用多台计算机并与他人合作,因此绝对路径名并不总是很好用,相对路径也同样成问题。作为一名LaTeX用户和爱好者,但肯定不是开发人员,我发现我自己的自定义代码(在 class 和 sty 文件中)不易移植,而且也不容易被多个项目、多个平台和多个用户访问。

答案1

我不确定我是否完全理解了类文件的设置、加载各种包的方式以及定义新宏的方式(或重新定义现有宏的方式)。当然,不要通过语句加载包(通常在扩展名为 .sty 的文件中)\input。相反,使用\usepackage指令。如果没有其他原因,您应该这样做,因为它\usepackage提供了一些保护,防止使用不兼容的选项两次(或更多次……)加载同一个包。同样,您可能希望将当前通过语句加载的文件重命名\input为具有扩展名.sty,以便它们可以(应该?)通过\usepackage语句加载。

另外,您是否实现了文档类级选项,以便您在运行时决定应该加载或不应该加载哪些包?

相关内容