我见过问题(和这个)解释如何在列表标签后换行,但有时我的项目标签会填满整行,在这种情况下我不想创建一个空行。有没有办法插入一个命令仅有的如果没有占用整行,则断行,因此作者不必根据边距等手动调整代码。
例如,在这种情况下,第二个 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
(通过\\
)你最终允许二换行符。这可以通过删除现有的\penalty
using来避免\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}