我的自定义enumerateoptional
enumitem 环境在我的枚举列表中间放置了一个无用的空行。
要重现此问题,您需要将一行填充 100%。请参阅我从完整文档中提取的此示例,重现了此问题:
\documentclass[12pt]{article}
\errorcontextlines 10000
\usepackage[shortlabels]{enumitem}
\def\renewenumerateoptionalitem{%
\let\itemenumerateoptional\item%
\renewcommand{\item}[1][]{%
\refstepcounter{enumerateoptionali}% increment the counter
\itemenumerateoptional[\bfseries##1~\theenumerateoptionali]%
}%
}
\newlist{enumerateoptional}{enumerate}{1}
\setlist[enumerateoptional]{
before=\renewenumerateoptionalitem,
label=\arabic*,
nosep,
align=left,
leftmargin=*,
after=\let\item\itemenumerateoptional,
}
\usepackage{hyperref}
\begin{document}
\begin{enumerateoptional}[1.]
\item[\bfseries test\_duplicatedContext] Detecção de contextos duplicados e
emissão de um erro semântico.
\item[\bfseries test\_duplicatedIncludes] Detecção de inclusões duplicadas e
emissão de um erro semântico.
\item[\bfseries test\_invalidRegexInput] Detecção de expressões regulares
inválidas e emissão de um erro semântico.
\item[\bfseries test\_missingIncludeDetection] Detecção da inclusão um bloco
inexistente.
\item[\bfseries test\_duplicatedGlobalNames] Detecção de múltiplas definições
do nome da gramática e
emissão de um erro semântico.
\item[\bfseries test\_missingScopeGlobalName] Detecção da falta da definição do
nome do escopo global da gramática e emissão de um erro semântico.
\end{enumerateoptional}
\end{document}
在下图中,额外的新行位于第 4 项和第 5 项之间。发生这种情况的原因是第 4 行已填充 100% 最大宽度,而 latex 在其后放置了一条额外的新行,我不知道为什么。
我怎样才能阻止这个无用的空行出现在列表中间,这取决于每个项目行的大小?
答案1
您看到的空白行是由于代码的错误而导致的,并在该确切位置hyperref
创建了 PDF 目标(当您使用时)。\refstepcounter
在文本后添加 的解决方法\par
是可行的,因为段落已构建,然后 PDF 目标插入到下一行的开头,一切顺利。在行尾添加 PDF 目标可能会导致目标转到下一个(就 TeX 所能看到的而言),然后该行看起来是空的。
\par
一个可以说更好的解决方法是在修改后的命令定义的开头添加\item
,以便确保 PDF 目标插入到正确的位置。
然而,正确的方法是将目标附加到其\item
自身,这样 PDF 目标就会总是在正确的地方。一个好的 坏的插入它的位置就在打印计数器值之前。正如 Ulrike 在评论中所说,标签排版在一个框中(默认情况下),并且丢失了\@currentlabel
(我错误地假设它的分配是全局的,就像计数器一样)。
这是一个重新制作的版本,它使用了一个修补版本,在正确的位置\@item
使用了它\refstepcounter
,并使用了更多enumitem
\documentclass[10pt]{article}
\usepackage[shortlabels]{enumitem}
\usepackage{etoolbox}
\makeatletter
\let\user@item\@item
\patchcmd\user@item{\if@noitemarg}{\iftrue}{}{\FAILED}
\enitkv@key{}{formatarg}{\def\enit@format##1{#1}}
% Compatibility with older enumitem.sty:
\@ifundefined{enitkv@enumitem@formatarg}
{\enitkv@key{enumitem}{formatarg}{\def\enit@format##1{#1}}}{}
\newlist{enumerateoptional}{enumerate}{1}
\setlist[enumerateoptional]{%
before=\let\@item\user@item,
formatarg=\textbf{########1~\@itemlabel},
nosep,
align=left,
leftmargin=*,
}
\makeatother
\usepackage[colorlinks]{hyperref}
\begin{document}
\begin{enumerateoptional}[1.]
\item[test\_duplicatedContext] Detecção de contextos duplicados e
emissão de um erro semântico.
\item[test\_duplicatedIncludes] Detecção de inclusões duplicadas e
emissão de um erro semântico.
\item[test\_invalidRegexInput] Detecção de expressões regulares
inválidas e emissão de um erro semântico.
\item[test\_missingIncludeDetection]\label{this} Detecção da inclusão um bloco
inexistente.
\item[test\_duplicatedGlobalNames] Detecção de múltiplas definições
do nome da gramática e
emissão de um erro semântico.
\item[test\_missingScopeGlobalName] Detecção da falta da definição do
nome do escopo global da gramática e emissão de um erro semântico. Ver item~\ref{this}.
\end{enumerateoptional}
\end{document}
并且没有必要\item
在after
代码中恢复(它也不会造成任何损害),因为\let
您所做的只是环境本地的操作,所以一旦结束\item
就会恢复到其原始定义。
您也不需要\bfseries
在每个单独的\item
:中已经使用了\bfseries
新的定义\item
。