列表中的项目标签后是否断行,但如果占满一行则不断行?

列表中的项目标签后是否断行,但如果占满一行则不断行?

我见过问题(和这个)解释如何在列表标签​​后换行,但有时我的项目标签会填满整行,在这种情况下我不想创建一个空行。有没有办法插入一个命令仅有的如果没有占用整行,则断行,因此作者不必根据边距等手动调整代码。

例如,在这种情况下,第二个 Case 语句后面的空行是不需要的。 带有不想要的换行符的示例

这是用以下代码生成的。

\documentclass{amsart}
\usepackage{xparse}
\usepackage{amsmath,amssymb}
\usepackage{enumitem}
\usepackage{unicode-math}
    \setmainfont{XITS}
    \setmathfont{XITS Math}
    \setmathfont{XITS Math}[range={\mathscr,\mathbfscr}]
    \setmathfont{XITS Math}[range={\mathcal,\mathbfcal},StylisticSet=1]

\makeatletter

\newlist{pfcasesnonum}{enumerate}{3}
        \setlist[pfcasesnonum]{
          label={Case}\protect\thiscase:~,
          align=left,
          labelsep=!,
          itemindent=-1em,
          leftmargin=2em,
          labelindent=0pt,
          labelwidth=0pt
        }
        \setlist[pfcasesnonum,1]{
            before=\def\pfcasecounter@pmg{pfcasesnonumi},
        }
\newenvironment{pfcases}{
            \ProvideDocumentCommand{\case}{o}{
                    \def\thiscase{~##1}%
                \item  \protected@edef\@currentlabel{##1}
        }
        \begin{pfcasesnonum}
        }
        {\end{pfcasesnonum}}
\makeatother

\begin{document}
 % \directlua{tex.write("2020-02-24 v1.15")}
% \@ifundefinedcolor{Black}{undefined}{defined}

\begin{pfcases}
\case[foo foo foo foo foo foo foo foo foo foo foo foo] \mbox{} \\bar bar
\case[foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo] \mbox{} \\bar bar
\end{pfcases}

\end{document}

我希望用户能够使用相同的代码在其自己的行上获取 case 语句,而无需检查它是否填满整行。

请注意,此代码已大大简化(但我可能遗漏了一些不必要的方面),以删除无关紧要的功能,例如编号、引用重复案例条件,这就是我首先要定义此环境的原因。理想情况下,我可以通过某种方式修改 case 命令,以便不具备深厚 tex 知识的用户可以使用简单的\\或类似\hfil \\或 的命令来执行此操作\leavevmode \\

答案1

问题是,\penalty如果标签填满整行,则在标签后插入一个,以确保在那里完成换行。这通常是可取的,但因为你添加\penalty(通过\\)你最终允许换行符。这可以通过删除现有的\penaltyusing来避免\unpenalty。这要求您使用\leavevmode而不是\mbox{}来离开 vmode,因为否则框会“隐藏” \penalty。在这里我定义了一个新命令来使这更容易:

\documentclass{amsart}
\usepackage{xparse}
\usepackage{amsmath,amssymb}
\usepackage{enumitem}
\usepackage{unicode-math}
    \setmainfont{XITS}
    \setmathfont{XITS Math}
    \setmathfont{XITS Math}[range={\mathscr,\mathbfscr}]
    \setmathfont{XITS Math}[range={\mathcal,\mathbfcal},StylisticSet=1]

\makeatletter

\newlist{pfcasesnonum}{enumerate}{3}
        \setlist[pfcasesnonum]{
          label={Case}\protect\thiscase:~,
          align=left,
          labelsep=!,
          itemindent=-1em,
          leftmargin=2em,
          labelindent=0pt,
          labelwidth=0pt
        }
        \setlist[pfcasesnonum,1]{
            before=\def\pfcasecounter@pmg{pfcasesnonumi},
        }
\newenvironment{pfcases}{
            \ProvideDocumentCommand{\case}{o}{
                    \def\thiscase{~##1}%
                \item  \protected@edef\@currentlabel{##1}
        }
        \begin{pfcasesnonum}
        }
        {\end{pfcasesnonum}}

\makeatother

\NewDocumentCommand \adjustednewline {} {%
    \leavevmode  % Start the paragraph -- avoids "no line here to end"
    \unskip      % Not necessary when only used after \item, but it's a bit safer when used in other situations
    \unpenalty   % If we already had a penalty, remove it
    \newline     % Finally break the line
}

\begin{document}
 % \directlua{tex.write("2020-02-24 v1.15")}
% \@ifundefinedcolor{Black}{undefined}{defined}

\begin{pfcases}
    \case[foo foo foo foo foo foo foo foo foo foo foo foo] \adjustednewline bar bar
\case[foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo] \adjustednewline bar
\end{pfcases}

\end{document}

答案2

根本不是一个列表环境,但可能足够了:


姆韦


\documentclass{amsart}
\usepackage{parskip,lipsum}
\def\case#1{\par\noindent\hangindent2em{Case %
{\em  #1}:}\hfill\mbox{}\linebreak} 
\begin{document}
\case{\lipsum[3][1]} \lipsum[2][1-3]
\case{\lipsum[8][2] Ad hoc finis} \lipsum[2][1-3]
\case{\lipsum[3][1-2]} \lipsum[2][1-3]
\end{document}

相关内容