对于编程命令:当且仅当我们在段落内时发出 \newline

对于编程命令:当且仅当我们在段落内时发出 \newline

简洁版本:我正在定义一个环境:

\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}}

相关内容