阅读问题之前,请先查看附录。我没有删除或对其进行重大编辑,以免使@cfr 的答案无效。
我正在尝试向定理环境添加一些钩子,我注意到它们在周围和正文旁边添加了不必要的空格。这是第一次简单的尝试,它定义了\ExplSyntaxOn
和之间的环境\ExplSyntaxOff
以避免任何意外的空格:
\documentclass{article}
\usepackage{amsthm}
\NewHook{mythm/prehead}
\NewHook{mythm/posthead}
\NewHook{mythm/prefoot}
\NewHook{mythm/postfoot}
\newtheorem{theorem}{Theorem}
\ExplSyntaxOn
\NewDocumentEnvironment{mytheorem}{ O{} }
{
\UseHook{mythm/prehead}
\begin{theorem}[#1]
\UseHook{mythm/posthead}
}
{
\UseHook{mythm/prefoot}
\end{theorem}
\UseHook{mythm/postfoot}
}
\ExplSyntaxOff
\AddToHook{mythm/prehead}{PREHEAD}
\AddToHook{mythm/posthead}{POSTHEAD}
\AddToHook{mythm/prefoot}{PREFOOT}
\AddToHook{mythm/postfoot}{POSTFOOT}
\begin{document}
before
\begin{mytheorem}
body
\end{mytheorem}
after
\end{document}
每个钩子上添加的代码周围都有多余的空格。请注意,这与我定义的输出相同
\NewDocumentEnvironment{mytheorem}{ O{} }
{
PREHEAD
\begin{theorem}[#1]
POSTHEAD
}
{
PREFOOT
\end{theorem}
POSTFOOT
}
因此\UseHook
s 不是真正的问题。
经过对\unskip
、\ignorespaces
和进行各种尝试后\ignorespacesafterend
,我找到了一种可以删除空格的组合:
\documentclass{article}
\usepackage{amsthm}
\NewHook{mythm/prehead}
\NewHook{mythm/posthead}
\NewHook{mythm/prefoot}
\NewHook{mythm/postfoot}
\newtheorem{theorem}{Theorem}
\ExplSyntaxOn
\NewDocumentEnvironment{mytheorem}{ O{} }
{
\unskip % \ignorespaces does not work here
\UseHook{mythm/prehead}
\begin{theorem}[#1]
\UseHook{mythm/posthead}
\ignorespaces % \unskip does not work here
}
{
\unskip % \ignorespaces does not work here
\UseHook{mythm/prefoot}
\end{theorem}
\UseHook{mythm/postfoot}
\ignorespacesafterend % neither \unskip nor \ignorespaces work here
}
\ExplSyntaxOff
\AddToHook{mythm/prehead}{PREHEAD}
\AddToHook{mythm/posthead}{POSTHEAD}
\AddToHook{mythm/prefoot}{PREFOOT}
\AddToHook{mythm/postfoot}{POSTFOOT}
\begin{document}
before
\begin{mytheorem}
body
\end{mytheorem}
after
\end{document}
这是从环境中移除空格的正确方法吗?阅读后这线程,我更好地理解了命令的作用,但我想知道是否存在任何明显的缺点或不兼容性(例如,定理永远不会处于垂直模式,对吗?)。
附录
正如@cfr在下面的答案中指出的那样,应该在前头和后尾钩子之前有空格,因为输入中有明确的空格(来自换行符)。所以,我的问题应该只适用于\ignorespaces
删除后头钩子之后和\unskip
前尾钩子之前的空格是否合适。为我的愚蠢错误道歉。
与 thmtools 的比较
这些钩子的构思来自 thmtools 包。它只删除 posthead 钩子后面的空格,而不删除 prefoot 之前的空格。以下是示例。
\documentclass{article}
\usepackage{amsthm,thmtools}
\declaretheorem{theorem}
\addtotheorempreheadhook{PREHEAD}
\addtotheorempostheadhook{POSTHEAD}
\addtotheoremprefoothook{PREFOOT}
\addtotheorempostfoothook{POSTFOOT}
\begin{document}
before
\begin{theorem}
body
\end{theorem}
after
\end{document}
答案1
请注意,该答案不包含任何有效代码。
买者自负 ...
首先,你似乎意识到了,间距不是由你使用钩子引入的。为了看到这一点,我们可以简单地使用
ABC\UseHook{mythm/prehead}\UseHook{mythm/posthead}\UseHook{mythm/prefoot}\UseHook{mythm/postfoot}XYZ
由此可以明显看出,没有任何钩子增加任何空间。
其次,您提出的“解决方案”将产生许多不良影响。充其量,您将得到令人震惊的印刷输出。(尝试\hrule
在mytheorem
或分段命令或列表之前或...)。
第三,如果“All Kinds of Stuff”碰巧进入了附近,它就会中断mytheorem
。因此,虽然消除上下所有垂直间距mytheorem
将创建非常难看的文档,但这不太可能成为大问题,因为您不太可能获得任何输出。
例如,
\documentclass[a5paper]{article}% does NOT compile without error
\usepackage{amsthm}
\usepackage{kantlipsum}
\NewHook{mythm/prehead}
\NewHook{mythm/posthead}
\NewHook{mythm/prefoot}
\NewHook{mythm/postfoot}
\newtheorem{theorem}{Theorem}
\ExplSyntaxOn
\NewDocumentEnvironment{mytheorem}{ O{} }
{
\unskip % \ignorespaces does not work here
\UseHook{mythm/prehead}
\begin{theorem}[#1]
\UseHook{mythm/posthead}
\ignorespaces % \unskip does not work here
}
{
\unskip % \ignorespaces does not work here
\UseHook{mythm/prefoot}
\end{theorem}
\UseHook{mythm/postfoot}
\ignorespacesafterend % neither \unskip nor \ignorespaces work here
}
\ExplSyntaxOff
\AddToHook{mythm/prehead}{PREHEAD}
\AddToHook{mythm/posthead}{POSTHEAD}
\AddToHook{mythm/prefoot}{PREFOOT}
\AddToHook{mythm/postfoot}{POSTFOOT}
\begin{document}
\begin{mytheorem}
\begin{mytheorem}
\kant[1]
\end{mytheorem}
\begin{verbatim}
\macro
\end{verbatim}
\begin{mytheorem}
\kant[2]
\end{mytheorem}
\end{document}
也许您不使用verbatim
?
\begin{mytheorem}
\kant[1]
\end{mytheorem}
\begin{center}
I'm in the centre.
\end{center}
\begin{mytheorem}
\kant[2]
\end{mytheorem}
或者center
?(或者flushleft
或者……?)
\begin{mytheorem}
\kant[1]
\end{mytheorem}
\[
x^2
\]
\begin{mytheorem}
\kant[2]
\end{mytheorem}
或者显示风格的数学?
或者 ... ?