LaTeX3 文档类别:棺材与 LaTeX2e 样式

LaTeX3 文档类别:棺材与 LaTeX2e 样式

语境:我目前正在设置一个小日记。为此,我编写了一个基于 expl3 的文档类。预计文章每次都从页面的相同高度开始(这也意味着文章的标题/副标题/作者的空间相同)。

问题:在研究一种简单的方法 ( \inputarticle) 来实现这一点时,我使用了许多 LaTeX2e 命令,我必须手动自定义这些命令(应该没问题)来调整它们的位置。另一方面,我想知道是否有一种更符合 l3 的方法,并使用棺材来复制相同的布局 ( \xinputarticle)。

问题:如果我在 l3 类环境中工作,最佳实践是什么:通常的 LaTeX2e 命令和框还是像棺材这样的东西?如果应该首选棺材,那么当前界面目前(2017 年)有多稳定?

文件myjournal.cls

\RequirePackage{expl3}
\ProvidesExplClass{myjournal}{2017/10/17}{0.0.1}{A journal}
\RequirePackage{xparse}

\LoadClass[a5paper,toc=sectionentrywithoutdots,twoside]{scrartcl}

\RequirePackage{multicol}
\RequirePackage{scrlayer-scrpage}

\RequirePackage[left=1cm,right=1cm,top=1cm,bottom=1.5cm,twoside]{geometry}

\pagestyle{plain}
\renewcommand{\titlepagestyle}{plain}
\renewcommand{\indexpagestyle}{plain}
\setkomafont{pageheadfoot}{\footnotesize\upshape\rmfamily}

\RedeclareSectionCommand[tocbeforeskip=6pt,beforeskip=2\baselineskip,afterskip=1sp]{section}
\newcommand\prefix@section{}

\NewDocumentCommand { \inputarticle } { m m m m }
    {
        \section[\detokenize{#1}]{\strut #1}
        \label{sec:\thesection}
        \noindent{\usekomafont{disposition}\strut#2}\par
        \noindent{\em\strut #4}\par
        \begin{multicols}{2}
        \noindent#3%
        \null\hfill\artende
        \end{multicols}
        \clearpage
    }

\coffin_new:N \l_myjournal_section_coffin
\coffin_new:N \l_myjournal_subtitle_coffin
\coffin_new:N \l_myjournal_author_coffin
\coffin_new:N \l_myjournal_result_coffin
\NewDocumentCommand { \xinputarticle } { m m m m }
    {
        \coffin_clear:N \l_myjournal_result_coffin
        \hcoffin_set:Nn \l_myjournal_section_coffin
                {\usekomafont{disposition}\Large\strut #1}
        \hcoffin_set:Nn \l_myjournal_subtitle_coffin
            {
                {\usekomafont{disposition}\strut#2}
            }
        \hcoffin_set:Nn \l_myjournal_author_coffin
            {
                {\em\strut #4}
            }
        \coffin_join:NnnNnnnn
            \l_myjournal_result_coffin {l} {t}
            \l_myjournal_section_coffin {l} {t}
            {0pt}{0pt}
        \coffin_join:NnnNnnnn
            \l_myjournal_result_coffin {l} {b}
            \l_myjournal_subtitle_coffin {l} {t}
            {0pt}{0pt}
        \coffin_join:NnnNnnnn
            \l_myjournal_result_coffin {l} {b}
            \l_myjournal_author_coffin {l} {t}
            {0pt}{0pt}
        \coffin_typeset:Nnnnn \l_myjournal_result_coffin {l} {t}
            {-10pt}{0pt}
        \begin{multicols}{2}
        \noindent#3%
        \null\hfill\artende
        \end{multicols}
        \clearpage
    }
\NewDocumentCommand { \artende } {}
    {
        \hspace*{\fill}■\par
    }

请不要责怪我还没有真正分离代码和界面层面。

文件mwe.tex

% arara: lualatex
% arara: lualatex: {synctex: 1}
% arara: lualatex: {synctex: 1}
%!TeX TS-program=arara
\documentclass{myjournal}

\title{Test}
\author{Journal Team}
\date{\today}

\usepackage{lipsum}

\begin{document}
    \xinputarticle{Test 1}
        {This has it all}
        {\lipsum[1-2]}
        {Some author}
    \xinputarticle{Test 2}
        {}
        {\lipsum[1-2]}
        {Without subtitle}
    \xinputarticle{Test 3}
        {Without author}
        {\lipsum[1-2]}
        {}
    \xinputarticle{Test 1}
        {This has it all}
        {\lipsum[1-2]}
        {Some author}
\end{document}

答案1

棺材接口很稳定,所以如果你正在使用expl3并且发现它们很有用,那么真的没有必要避免使用它们。另一方面,如果你更喜欢“传统”盒子结构,那么就使用它们吧。

类的整个概念expl3可能仍需要改进:理想情况下,代码放在包中,设计放在类中。然而,在我们整理出“设计语言”并明确 L3 类规范之前,还会存在一些混合。

相关内容