我一直在争论是否要问这个问题,因为我不想提出一个过于宽泛而无法回答的问题,或者仅仅基于观点的问题,但我认为可能有一些技术可以充分回答这个问题。
我正在寻找可以用来组织代码的方法,以简化或清理我的类文件或文档序言。下面是我的 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 文件中时,它们似乎不起作用。input
include
我无法为此提供 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
语句加载。
另外,您是否实现了文档类级选项,以便您在运行时决定应该加载或不应该加载哪些包?