既然 LaTeX 有钩子,那么建议使用 everypar 的钩子接口吗?在 l3 程序中应该如何做到这一点?
\documentclass{article}
\ExplSyntaxOn
\newcounter{eplinenumber}
\setcounter{eplinenumber}{0}
\def\epindent{3cm}
\def\inscriptionprefix{Line:\hskip3pt}
\cs_set:Npn \mymod #1 #2 {\int_mod:nn{#1}{#2}}
\def\step_mod{5}
\NewDocumentEnvironment{inscription}{}
{
\let\annumber\empty
\expandafter\parindent\epindent
\bigskip
\obeylines
\everypar{
{ \stepcounter{eplinenumber}
\ifnum\mymod{\theeplinenumber}{\step_mod}=0 \edef\annumber{\llap{\inscriptionprefix\theeplinenumber\hskip2pt}}\fi
\ifnum\theeplinenumber=0 \edef\annumber{}\fi
\ifnum\theeplinenumber=1
\edef\annumber{\llap{\inscriptionprefix\theeplinenumber\hskip2pt}}
\fi
\annumber
}
%}
}
}
{\bigskip\setcounter{eplinenumber}{0}}
\ExplSyntaxOff
\begin{document}
\begin{inscription}
L(ucius) Albinius f(ilius)]
[cum Galli ob]siderent Capitolium
[virgines Ve]stales Caere deduxit
[ibi sacra at]que ritus sollemnes ne
[intermitte]rentur curai sibi habuit
[urbe recup]erata sacra et virgines
[Romam rev]
\end{inscription}
\end{document}
答案1
请尊重expl3
命名约定并避免\cs_set
使用先前未声明的函数。
我不知道这是“推荐的方式”,但它使用了 2.3 节中记录的钩子,ltpara
并在一定程度上参考了 2.3 节中的示例。但请注意,本节警告这些示例对于生产使用不够谨慎,并且下面的代码不如这些示例谨慎。
康德提供了一个简单的检查,确保我已成功从钩子上移除代码。
请注意,我找不到在完全相同的位置插入代码的方法,因此我改变了段落缩进框,据记录可在段落挂钩中修改。
\documentclass{article}
% ateb: https://tex.stackexchange.com/a/702496/
% i gwestiwn Yiannis Lazarides: https://tex.stackexchange.com/q/702429/
\usepackage{kantlipsum}
\ExplSyntaxOn
\dim_new:N \l_lazarides_epindent_dim
\dim_set:Nn \l_lazarides_epindent_dim { 3cm }
\int_new:N \g_lazarides_eplinenumber_int
\int_gzero:N \g_lazarides_eplinenumber_int
\int_new:N \l_lazarides_modstep_int
\int_set:Nn \l_lazarides_modstep_int { 5 }
\cs_new_protected:Nn \lazarides_inscriptionprefix:n {
\hbox_gset:Nn \g_para_indent_box
{
\skip_horizontal:n { \l_lazarides_epindent_dim }
\hbox_overlap_left:n
{
Line : \skip_horizontal:n { 3pt}
\int_to_arabic:n { #1 }
\skip_horizontal:n { 2pt }
}
}
}
\NewDocumentEnvironment{inscription}{}
{
\dim_set_eq:NN \parindent \l_lazarides_epindent_dim
\bigskip
\obeylines
\AddToHook { para / begin } [ lazarides ]
{
\int_gincr:N \g_lazarides_eplinenumber_int
\int_compare:nNnTF
{
\int_mod:nn { \g_lazarides_eplinenumber_int } { \l_lazarides_modstep_int }
} = { 0 }
{
\lazarides_inscriptionprefix:n { \g_lazarides_eplinenumber_int }
}{
\int_compare:nNnT { \g_lazarides_eplinenumber_int } = { 1 }
{
\lazarides_inscriptionprefix:n { 1 }
}
}
}
}
{
\bigskip
\int_gzero:N \g_lazarides_eplinenumber_int
\RemoveFromHook { para / begin }[ lazarides ]
}
\ExplSyntaxOff
\begin{document}
\begin{inscription}
L(ucius) Albinius f(ilius)]
[cum Galli ob]siderent Capitolium
[virgines Ve]stales Caere deduxit
[ibi sacra at]que ritus sollemnes ne
[intermitte]rentur curai sibi habuit
[urbe recup]erata sacra et virgines
[Romam rev]
\end{inscription}
\kant[2]
\end{document}