我怎样才能阻止这个无用的空行出现在我的列表中间?

我怎样才能阻止这个无用的空行出现在我的列表中间?

我的自定义enumerateoptionalenumitem 环境在我的枚举列表中间放置了一个无用的空行。

要重现此问题,您需要将一行填充 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}

在此处输入图片描述

并且没有必要\itemafter代码中恢复(它也不会造成任何损害),因为\let您所做的只是环境本地的操作,所以一旦结束\item就会恢复到其原始定义。

您也不需要\bfseries在每个单独的\item:中已经使用了\bfseries新的定义\item

相关内容