我正在尝试使用该包定义一个证明环境ntheorem
。但是,我似乎无法将“证明结束”符号打印到我的文档中,尽管我没有收到来自编译器的错误消息。
这是一个很小的例子,其中 -symbol\Box
没有显示出来。
\documentclass[parskip]{scrreprt}
\usepackage[utf8]{inputenc}
\usepackage{amssymb,amsmath}
\usepackage[amsmath,thmmarks]{ntheorem}
\theoremstyle{nonumberplain}
\theoremheaderfont{\bfseries}
\theorembodyfont{\normalfont}
\theoremseparator{:}
\theoremsymbol{\ensuremath{\Box}}
\newtheorem{Proof}{Proof}
\begin{document}
\begin{Proof}abc.\end{Proof}
\end{document}
谁能告诉我我的代码有什么问题?
答案1
总结
有一种解决这个问题的 hack 方式,但最好的办法是将s 放在单独的行上。我建议你也\end
把s 放在单独的行上。\begin
长版本
一种“破解”方法是将以下内容添加到序言中:
\makeatletter
\renewcommand{\@endtrivlist}[1]{\if@inlabel \indent \fi \if@newlist \@noitemerr \fi \ifhmode #1\unskip \par \if@noparlist \else \ifdim \lastskip >\z@ \@tempskipa \lastskip \vskip -\lastskip \advance \@tempskipa \parskip \advance \@tempskipa -\@outerparskip \vskip \@tempskipa \fi \@endparenv \fi}
\makeatother
这使得证明符号出现:
但是,您使用这种 hack 需要您自担风险,因为我不知道在其他情况下\@endtrivlist
使用它会导致什么。一种想法可能是定义一个宏来执行此重新定义,并在证明的每个末尾输入它。这很无聊,但它可以工作并且不会造成任何问题,前提是您不在列表中进行证明(但这无论如何不会造成麻烦,因为重新定义将以证明结束而结束),并且您将重新定义放在证明的末尾,而不是在证明中列表的中间或之前。
等待其他人给出一个不那么“作弊”的方法:)。
更新
正如 daleif 在他的评论中指出的那样,将 放在\end
单独的行上,除了使代码更具可读性(因为它显示了环境的结束,而不是将其隐藏在 env 本身的最后一行)之外,还解决了问题,而无需这种欺骗。但我不知道为什么。无论如何,将\begin
s 和\end
s 放在单独的行上是绝对明智的,因为这样可以使代码更具可读性。
有趣的是,如果将 单独放在\end
一行上,则当和 在同一行时,会变成\lastskip
12.0pt plus 4.0pt minus 6.0pt
而不是。这就是出现证明符号的原因。但不知道为什么会发生这种情况……我的意思是,由于行尾是单个的,TeX 应该将行尾转换为空格。如果是两个,我们会有一个换行符,因此会跳过,这样就没问题了,但符号会放在错误的行上,就像 Christian 的解决方案中发生的那样。但这样一来,我想知道为什么会改变。可能会问一个问题。0.0pt
\end
abc.
\lastskip
更新 2
维基百科来救援,解释什么\lastskip
是:
如果最后一项是 (m)glue,则此命令具有最后一项的长度值。在这种情况下,
\lastskip
可以使用 来指代该长度。如果最后一项不是 (m)glue,\lastskip
则为0.0pt
。
所以这个名字有点误导。这解释了为什么空格会改变事物:空格插入胶水,因此最后一个项目是胶水,\lastskip
因此会发生变化。
答案2
一种快捷方式是使用\theorempostwork{\hfill$\Box$}
(或任何符号)。
\documentclass[parskip]{scrreprt}
\usepackage[utf8]{inputenc}
\usepackage{amssymb,amsmath}
\usepackage[amsmath,thmmarks]{ntheorem}
\theoremstyle{nonumberplain}
\theoremheaderfont{\bfseries}
\theorembodyfont{\normalfont}
\theoremseparator{:}
%\theoremsymbol{\ensuremath{\Box}}
\theorempostwork{\hfill$\Box$}
\newtheorem{Proof}{Proof}
\begin{document}
\begin{Proof}abc.\end{Proof}
\end{document}