\label{} 后新环境中的水平空间

\label{} 后新环境中的水平空间

为什么下面的mwe中插入了水平空格?

\documentclass{scrartcl}

\usepackage[american]{babel}
\usepackage{environ}
\usepackage{amsthm}

% proof environment
\makeatletter
\let\proof\relax
\let\endproof\relax
\NewEnviron{proof}[1][true]{%
  \pushQED{\qed}%
  \csname if#1\endcsname
    \trivlist
    \item\relax{\sffamily\bfseries Proof}\par\noindent
    \BODY
    \popQED\endtrivlist
  \fi
}
\makeatother

\begin{document}
\begin{proof}
  Just some text
\end{proof}

\begin{proof}\label{foo}
  Just some text (after a label)
\end{proof}

\begin{proof}[true]
  Just some text after optional argument true
\end{proof}
\end{document}

答案1

如果您使用这样的构造,则\par\noindent在输出中不可避免地会产生虚假空间,这\label恰好是此处的触发因素,但真正的问题是您过早启动了水平模式,并且在水平模式下,空白会形成单词空间。您会发现,\label如果您将原始文档更改为\begin{proof}{}仅包含,则不会真正涉及这一点,{}这足以获得您不需要的坏空间\label{foo}

在此处输入图片描述

\documentclass{scrartcl}

\usepackage[american]{babel}
\usepackage{environ}
\usepackage{amsthm}

% proof environment
\makeatletter
\let\proof\relax
\let\endproof\relax
\NewEnviron{proof}[1][true]{%
  \pushQED{\qed}%
  \csname if#1\endcsname
    \trivlist
\labelsep\z@
\def\makelabel##1{\makebox[\linewidth][l]{##1}}%
    \item[\sffamily\bfseries Proof]%
    \BODY
    \popQED\endtrivlist
  \fi
}
\makeatother

\begin{document}

\noindent X\dotfill X

\begin{proof}
  Just some text\\hhh
\end{proof}

\begin{proof}\label{foo}
  Just some text (after a label)
\end{proof}

\begin{proof}[true]
  Just some text after optional argument true
\end{proof}
\end{document}

答案2

众所周知,LaTeX 对行末的空格非常挑剔。

因此,为了避免出现多余的空白,可以在末尾添加注释冒犯线。

\label{foo}%%

一般来说,用如下控制序列来结束行是安全的,例如

\bfseries

但是,除控制序列之外的任何东西都会导致页面中添加额外的空白。LaTeX 唯一可以使用的地方是通常忽略行首的空白。(我说通常是因为在某些情况下,例如verbatim环境及其同类情况下,情况并非如此。)

答案3

如果你真的真的想要换行符证明,然后使用不同的方法,借助enumitem

\documentclass{scrartcl}

\usepackage[american]{babel}
\usepackage{environ,letltxmacro,enumitem}
\usepackage{amsthm}
\usepackage{amsmath}

\newif\ifshowproof
\showprooftrue

% proof environment
\let\proof\relax
\let\endproof\relax
\NewEnviron{proof}[1][showproof]{%
  \csname if#1\endcsname
    \pushQED{\qed}%
    \description[topsep=6pt plus 6pt,style=nextline,leftmargin=0pt,font=\bfseries]
    \item[Proof]
    \BODY
    \popQED\enddescription
  \fi
}

\begin{document}
Proof with hide feature:
\begin{proof}[false]\label{x}
  This should not appear
\end{proof}

Proof without hide feature:
\begin{proof}\label{y}
  This should appear
\end{proof}
\end{document}

在此处输入图片描述

但是,请怜悯你的读者。;-)

相关内容