强制 LaTeX 结构的方法?

强制 LaTeX 结构的方法?

某些类型的出版物(例如模块文档)具有清晰的结构(例如,第一个出版物有一个介绍部分,最后提供源代码,...)

我想知道 LaTeX 或某些软件包是否可以强制用户遵守给定的结构。如果用户未能按照指定的结构编写文档,至少应该打印一条警告。

答案1

据我所知,你无法强制执行结构,只能以\section不同的顺序出现。但你可以扩展(模仿)该\maketitle机制。

定义一些宏,例如

\newcommand{\mc@introduction}{}
\newcommand{\introduction}[1]{%
    \renewcommand{\mc@introduction}{#1}%
}

mc@前缀可以自由选择。我将其用于mcMyClass...)并在宏中使用它们,例如\makedocument

\newcommand{\makedocument}{%
    Some text 

    \addsec{Introduction}
    \mc@introduction

    \let\makedocument\relax
}

最后一行确保\makedocument不能使用两次。etoolbox您可以\makedocument在文档末尾自动调用。

\AtEndDocument{\makedocument}

如果必须提供某些信息,您可以\mc@introduction像这样初始化宏

\newcommand{\mc@introduction}{
    \ClassError{myclass}{\string\introduction\space not used.}{%
        You must provide the introduction.
    }
}

当你重新定义时,\section你可以允许在文档中使用它

\renewcommand{\section}[1][]{%
    \ClassError{myclass}{Don't use \string\section}{%
        You are not allowed to use \string\section
        in your document!
    }
}

但你必须保存定义重新定义如果你想使用\makedocument

\let\addsec\section

这是一个完整但非常基本的例子:

% myclass-test.tex
\documentclass{myclass}

\begin{document}
\faqs{The order in the document won't change anything.}

\introduction{Text}

%\section{Test}% caues an error

%\makedocument% optional
\end{document}

结果

% myclass.cls
\ProvidesClass{myclass}

\LoadClassWithOptions{article}

\RequirePackage{etoolbox}

\newcommand{\mc@introduction}{
    \ClassError{myclass}{\string\introduction\space not used.}{%
        You must provide the introduction.
    }
}
\newcommand{\introduction}[1]{%
    \renewcommand{\mc@introduction}{#1}%
}
\newcommand{\mc@information}{}
\newcommand{\information}[1]{%
    \renewcommand{\mc@information}{#1}%
}
\newcommand{\mc@faqs}{}
\newcommand{\faqs}[1]{%
    \renewcommand{\mc@faqs}{#1}%
}

\let\addsec\section

\renewcommand{\section}[1][2]{%
    \ClassError{myclass}{Don't use \string\section}{%
        You are not allowed to use \string\section
        in your document!
    }
}

\newcommand{\makedocument}{%
    Some text that is always the same in
    every single document.

    \addsec{Introduction}
    \mc@introduction

    \addsec{Information}
    \mc@information

    \addsec{FAQs}
    \mc@faqs

    \let\makedocument\relax
}

\AtEndDocument{\makedocument}

相关内容