如何整理你的 main.tex

如何整理你的 main.tex

有没有办法整理你的LaTeX项目?错误不断累积,但很难找出哪些包是不必要的/有冲突的包。特别是如果你正在使用模板并在此过程中进行自定义:

\documentclass[
11pt,english, onehalfspacing, nolistspacing, liststotoc, headsepline, oneside, chapterinoneline, reqno, a4paper, toctotoc, table]{report}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[shortlabels]{enumitem}
\usepackage[autostyle=true]{csquotes}
\usepackage[backend=biber, style=apa, natbib=true, autocite=inline, uniquename=false]{biblatex}
\usepackage[font=large,labelfont=bf]{caption}
\usepackage{xcolor}
\usetikzlibrary{calc}

%
\usepackage{amsthm, amsmath, amssymb, amsfonts, exscale, latexsym, float, eucal, mathtools, adjustbox, textcomp, mathpazo, lipsum, rotating, pdflscape, subcaption, booktabs, makecell, flafter, xpatch, wrapfig, tikz, minted, arydshln, blkarray, tabularx, array}
%

%-------------------------------------------------------------
%   ADDITIONAL FORMATTING
%-------------------------------------------------------------

\geometry{
    paper=a4paper, % Change to letterpaper for US letter
    inner=1cm, % Inner margin
    outer=1cm, % Outer margin
    bindingoffset=0.5cm, % Binding offset
    top=1cm, % Top margin
    bottom=1cm, % Bottom margin
    %showframe, % Uncomment to show how the type block is set on the page
}

\DeclareLanguageMapping{english}{english-apa}
\addbibresource{References.bib}

\AtBeginDocument{
\hypersetup{pdftitle=\ttitle} % Set the PDF's title to your title
\hypersetup{pdfauthor=\authorname} % Set the PDF's author to your name
\hypersetup{pdfkeywords=\keywordnames} % Set the PDF's keywords to your keywords
}

\captionsetup[subfigure]{width=0.8\textwidth}

\renewcommand{\chapterbelowskip}{\vspace{30pt}} % Spacing after chapter title
\renewcommand*\chaptermarkformat{\chapapp \thechapter\enskip}
\renewcommand{\baselinestretch}{1.3} % In-text line spacing
\renewcommand{\chapterfont}{\Huge\bfseries}
\renewcommand{\thesubfigure}{\roman{subfigure}}
\newcommand{\euler}{e}
\newcommand{\E}{\mathrm{E}}
\newcommand{\Var}{\mathrm{Var}}
\newcommand{\Cov}{\mathrm{Cov}}
\newcommand{\Corr}{\mathrm{Corr}}
\DeclareMathOperator*{\plim}{plim}
\DeclarePairedDelimiter{\nint}\lfloor\rceil
\DeclarePairedDelimiter{\abs}\lvert\rvert

\makeatletter % Align list of figures and tables
 \renewcommand*\l@figure{\@dottedtocline{2}{0em}{3.2em}}
 \renewcommand*\l@table{\@dottedtocline{2}{0em}{3.2em}}
\makeatother

\expandafter\def\expandafter\normalsize\expandafter{%
    \normalsize
    \setlength\abovedisplayskip{0em}
    \setlength\belowdisplayskip{1em}
    \setlength\abovedisplayshortskip{0em}
    \setlength\belowdisplayshortskip{1em}
}

\newcommand\crd{\cellcolor{red!25}}
\newcommand\cgr{\cellcolor{green!25}}
\newcolumntype{C}{>{\centering\arraybackslash}X}
\newlength\mylen
\settowidth{\mylen}{VIII}

%-------------------------------------------------------------
%   REPORT INFORMATION
%-------------------------------------------------------------

\AtBeginDocument{
\hypersetup{pdftitle=\ttitle} % Set the PDF's title to your title
\hypersetup{pdfauthor=\authorname} % Set the PDF's author to your name
\hypersetup{pdfkeywords=\keywordnames} % Set the PDF's keywords to your keywords
}

\usemintedstyle{vs}

\begin{document}

\frontmatter
\pagestyle{plain}

\input{Chapters/Titlepage}

%-------------------------------------------------------------
%   LIST OF CONTENTS/FIGURES/TABLES PAGES
%-------------------------------------------------------------

\tableofcontents
\begingroup
\let\clearpage\relax
\listoffigures
\listoftables
\endgroup

%-------------------------------------------------------------
%   CHAPTERS
%-------------------------------------------------------------

\mainmatter
\pagestyle{thesis}

\include{Chapters/Abstract}
\include{Chapters/Background}
\include{Chapters/Methods}
\include{Chapters/Results}
\include{Chapters/Discussion}
\include{Chapters/Conclusion}
\include{Chapters/Appendix}


%-------------------------------------------------------------
%   APPENDICES
%-------------------------------------------------------------

%\appendix
%\renewcommand{\thefigure}{A\arabic{figure}}
%\setcounter{figure}{0}

%-------------------------------------------------------------
%   BIBLIOGRAPHY
%-------------------------------------------------------------

%\renewcommand*{\bibfont}{\small}
\printbibliography[heading=bibintoc, title={References}]

%----------------------------------------------------------------
\end{document}  

如您所见,添加了许多软件包和选项documentclass。如何整理这样的 main.tex 并删除任何错误?

答案1

你真的应该避免陷入需要问这个问题的情况。总是以空的序言开始文档,并且只在需要来自包的命令时才添加包

然而,对于这个特定例子有一些评论。

你加载负载但仍然收到未定义的命令错误

! Undefined control sequence.
<recently read> \usetikzlibrary 
                                
l.11 \usetikzlibrary
                    {calc}

由于没有定义,显然没有使用,因此请删除该行。

相似地

! Undefined control sequence.
l.21 \geometry
              {
? 

所以删除

\geometry{
    paper=a4paper, % Change to letterpaper for US letter
    inner=1cm, % Inner margin
    outer=1cm, % Outer margin
    bindingoffset=0.5cm, % Binding offset
    top=1cm, % Top margin
    bottom=1cm, % Bottom margin
    %showframe, % Uncomment to show how the type block is set on the page
}

因为除了生成错误之外它什么都没做。(如果你geometry更早地加载,那么它的定义可能会更糟,因为单列 A4 文档上的 1cm 边距会让阅读变得非常痛苦。

然后你得到

! LaTeX Error: Command \chapterbelowskip undefined.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
 ...                                              
                                                  
l.33 \renewcommand{\chapterbelowskip}
                                     {\vspace{30pt}} % Spacing after chapter...

? 

再次强调,这些行什么都不做,只是会产生错误,因此删除

如果你运行shell-escape它,它不会出错,但 latex 会发出警告

LaTeX Warning: Unused global option(s):
    [english,onehalfspacing,nolistspacing,liststotoc,headsepline,chapterinoneli
ne,toctotoc].

由于几乎所有使用的选项都没有定义(并且reqno是默认的),所以只需使用

\documentclass[11pt]{report}

然后你得到错误

! Undefined control sequence.
\__hook_toplevel begindocument -> \hypersetup 

所以添加

\usepackage{hyperref}

然后又出现另一个错误:

! Undefined control sequence.
<argument> \ttitle 

因此删除两个副本(!!!)

\AtBeginDocument{
\hypersetup{pdftitle=\ttitle} % Set the PDF's title to your title
\hypersetup{pdfauthor=\authorname} % Set the PDF's author to your name
\hypersetup{pdfkeywords=\keywordnames} % Set the PDF's keywords to your keywords
}

您的序言将最终无错误地加载,但仍会警告有关包加载顺序:

Package fvextra Warning: csquotes should be loaded after fvextra, to avoid a wa
rning from the lineno package on input line 37.

更一般地,避免做长列表,例如

\usepackage{amsthm, amsmath, amssymb, amsfonts, exscale, latexsym, float, eucal, mathtools, adjustbox, textcomp, mathpazo, lipsum, rotating, pdflscape, subcaption, booktabs, makecell, flafter, xpatch, wrapfig, tikz, minted, arydshln, blkarray, tabularx, array}

因为它会掩盖您已加载的包。

有些包只是定义了新的命令,因此加载它们而不使用它们只会减慢速度而不会造成实际损害,但如果不使用它们,则应删除它们。例如,它们lipsum永远不应该出现在真实文档中,你真的会使用吗blkarray?(我 25 年前写的,从未在真实文档中使用过它)

其他包只需加载它们就会影响整个文档,将它们分成单独的\usepackage调用会更清楚,例如在该列表的中间,mathpazo您切换到非常旧的 palatino 字体设置,newpxtext,newpxmath现在可能会更好。

minted是一个很好的软件包,但强制--shell-escape仅在您使用它时才加载它,并注意在这种情况下不要使用不受信任的代码。(这不适用于始终使用 shell-escape 的 overleaf,并使用 docker 容器并通过不在您的计算机上托管服务来减轻风险)

答案2

当您要求时systematic process,您可以这样做。当我一次向代码中添加了太多内容,或者尝试理解其他人的方法时,我经常会应用它。正如上面两条评论中提到的那样,这在某种程度上是逆向的,或者回归到逐步添加。

过程

  • 处理原始文件的副本
  • 删除和/或注释掉至少“一半”,在你的情况下几乎全部
  • 根据需要进行编译和更正
  • 编译完成后(策略性地)添加更多

例子

  • 我删除了几乎所有东西
  • 只剩下可能有用的部分(但还是有点太多了)
  • 我策略性地注释掉了我接下来要尝试的内容

现在,如果文件 Titlepage(?)存在一些问题,请在副本上重复此过程,直到解决问题。

作为副作用,缩进对于这几行代码来说变得有些自然,这可能会使您的长代码产生更好的结果。

顺便说一句,在重构方面,请参见下文,不要忘记考虑将某些部分再次移动到其他文件中。所有这些定义和包都可能是此主题。注意使用\input和之间的区别\include

结果代码无论是我做、你做还是别人做,结果都会有所不同。但是,从观察来看,我在这里描述的所有好处都会很容易实现。例如,包之间的不必要的交互将在添加代码的下一步中出现,并且将更容易发现、追踪和管理。

    \documentclass{report}
    
    \usepackage[utf8]{inputenc}
    \usepackage[T1]{fontenc}
    
    %\usemintedstyle{vs}
    
    \begin{document}
    
        %\frontmatter
        %\pagestyle{plain}
    
        \input{Chapters/Titlepage}
    
    %-------------------------------------------------------------
    %   LIST OF CONTENTS/FIGURES/TABLES PAGES
    %-------------------------------------------------------------
        \tableofcontents
    
    %-------------------------------------------------------------
    %   CHAPTERS
    %-------------------------------------------------------------
    %   \mainmatter
    %   \pagestyle{thesis}
    
    \end{document} 

从角度来看,这遵循了众所周知的、经过充分验证的和强烈推荐的 TDD (测试驱动设计) 方法,其内容如下:

  • 定义一个必须失败的测试(RED,缺少实现)
  • 添加需要通过的内容(GREEN只需完成测试)
  • REFACTOR(处理重复、准备下一步等)
  • REPEAT通过定义下一个必须失败的测试(尚未实现)

这很快产生了我称之为美丽代码的结果:有能力,具有某种优雅,更容易维护、改变和扩展。

现在,tests这里是:a)它编译时没有(重大)错误,b)文本按我想要的方式出现,或者至少现在足够好。

附录:一些可以“ delete”代码部分的方法。

  1. 始终在文件副本上工作

  2. 物理删除代码行

  3. 使用编辑器功能,即标记(鼠标左键按下)、剪切(Ctrl+X)和撤消(Ctrl+Z)

  4. 用于%注释掉专用的代码行

  5. 使用包提供的条件环境comment https://ctan.org/pkg/comment

  6. 使用ifthenhttps://ctan.org/pkg/ifthen

  7. condtional compilation另请参阅主题“ ”下的相关软件包https://ctan.org/topic/cond-comp

  8. 使用 Tex 原语\iffalse

  9. 标记代码片段,剪切并移动到专用的新文件中,\input您可以\input在所述新文件中级联其他语句,即重复这些步骤

  10. 上述方法的组合

一些特点这些方法:

  1. 故障安全方法

  2. 视觉清理,字面意思

  3. 是一种快速而智能的方法

  4. 容易做到,但结果往往很糟糕

5-8. 允许可选的“删除”,但代价是更加混乱

  1. 针对错误创建一个分层文件树

  2. 灵活性

答案3

您可以将许多软件包(尤其是那些外观上不太好看的软件包,如果您在风格不同的期刊上发表文章,则需要更换这些软件包)移到一个.sty文件中。如果即使更改了字体和布局,文档中仍需要某个命令,我建议将其保留在主文档中。

如果您被允许使用它,诸如fontsetup或之类的包unicode-math可以替换序言中的大量字体和符号包。

相关内容