语境:我目前正在设置一个小日记。为此,我编写了一个基于 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 类规范之前,还会存在一些混合。