为什么下面的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}
但是,请怜悯你的读者。;-)