简洁版本:我正在定义一个环境:
\newenvironment{myenv}{\begin{trivlist}\item}{HERE something\end{trivlist}}
现在,在标有“HERE”的位置,我需要一个“条件换行符”来执行以下操作:
如果我们在段落内,则发出\newline
。如果我们不在段落内,例如因为环境的内容以显示的数学结束,则不要发出换行符。
例子:
\begin{myenv}Text\end{myenv}
应该成为
\begin{trivlist}\item Text\newline something\end{trivlist}
和
\begin{myenv}\item \[ xy \]\end{myenv}
应该成为
\begin{trivlist}\item \[ xy \]something\end{trivlist}
我怎样才能实现这个目标?
背景:我需要在环境的末尾画一条水平线,而内容和线之间的垂直空间对于普通文本来说太小,或者对于显示的数学来说太大。
原始问题,如评论中所要求的:
\newenvironment{myenv}{%
\begin{trivlist}
\item
}{%%% HERE should be the conditional newline
{\begin{tikzpicture}[remember picture,overlay]%
\draw [solid,magenta,line width=2pt]
let
\p2 =($(current page.west)$)
in
(\x2,0) -- ($(\x2,0) + (10cm,0)$);
\end{tikzpicture}}%
\end{trivlist}
}% end newenvironment
问题在于,行和文本之间的距离要么太小要么太大,因为如果内容以显示的数学结束,LaTeX 就会开始一个新段落。
答案1
您始终可以使用\ifvmode
或进行检查\ifhmode
,例如\ifvmode do this\else do that\fi
。但在这里您不需要这样做,因为\par
这样做会起到这样的作用(不使用\newline
或\\
来结束段落)。我添加了 ,\noindent
如果 并且 ,则它不会造成任何损害\parskip=0pt
,当 时,它会按照您想要的方式运行\parskip≠0pt
。
\newenvironment{myenv}
{\begin{trivlist}\item}
{\par\noindent
\begin{tikzpicture}[remember picture,overlay]
\draw [solid,magenta,line width=2pt]
let
\p2 =($(current page.west)$)
in
(\x2,0) -- ($(\x2,0) + (10cm,0)$);
\end{tikzpicture}\end{trivlist}}