在每个列表项末尾添加代码

在每个列表项末尾添加代码

我的问题实际上是对这种情况的概括:我正在使用xhfill包用水平填充规则填充给定列表(通过包设置enumitem)中每个项目对应的最后一行(排版很糟糕,但某些法律文件需要这样做)。我想知道是否有办法自动在每个列表项的文本后添加规则命令,而不必手动添加。我的观点实际上是是否有办法做到这一点,以便可以在该点添加任何命令或宏。

答案1

下次,请提供 Johannes_B 提到的最小工作示例。这样可​​以更轻松地提供帮助,并且我的答案更有可能真正有用(我不确定)。

这是您要找的东西吗?此图显示了两个“常规”枚举之间的“合法”枚举。

常规和法定枚举

该代码使用了提供的before*和选项:after*enumitem

\documentclass{article}
\usepackage{enumitem}
\usepackage{xhfill}
\newcommand{\xfill}[2][1ex]{{%
  \dimen0=#2\advance\dimen0 by #1
  \leaders\hrule height \dimen0 depth -#1\hfill%
}}
\newlist{mylegal}{enumerate}{1}
\newif\iffirstlegal\firstlegalfalse% We need a toggle to track whether the item is first in the list or not
\setlist[mylegal]{%
  label=\arabic*.,
  before*={% This saves the standard definition of \item and then redefines it to add the fill if the item is not first on the list; if it is the first item, it omits the fill but toggles the firstlegal switch so the next item will trigger it
    \let\olditem\item% save the standard definition of \item in a macro, \olditem
    \firstlegaltrue% set the toggle for first item in the list to true
    \def\item{\iffirstlegal\olditem\firstlegalfalse\else \xfill{.5pt}\mbox{}\olditem\fi}% new, temporary defition of \item
    },
  after*={% This takes care of adding the fill for the final item on the list and just makes sure that \item is reset to its standard definition
    \xfill{.5pt}\mbox{}% fill for final item in list
    \let\item\olditem% restore standard definition of \item
    }%
  }

\begin{document}

% Get a baseline so we know what the regular enumerated list looks like...
A regular enumeration:
\begin{enumerate}
    \item An item
    \item Another item
\end{enumerate}

% Demonstrate the effect of the new list environment
A legal enumeration:
\begin{mylegal}
     \item An item
     \item Another item
\end{mylegal}

% Make sure that \item is correctly reset by comparing the output here with the baseline
A regular enumeration:
\begin{enumerate}
    \item An item
    \item Another item
\end{enumerate}

\end{document}

请注意,其工作方式涉及重新定义\item以添加填充第一的。这就是为什么有必要排除第一个列表项(我们不想在开始之前有一行)并特殊处理最后一个列表项(因为否则它根本不会得到一行)。

相关内容