向环境添加钩子时删除空格的正确方法

向环境添加钩子时删除空格的正确方法

阅读问题之前,请先查看附录。我没有删除或对其进行重大编辑,以免使@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}

测试1

每个钩子上添加的代码周围都有多余的空格。请注意,这与我定义的输出相同

\NewDocumentEnvironment{mytheorem}{ O{} }
  {
    PREHEAD
    \begin{theorem}[#1]
    POSTHEAD
  }
  {
    PREFOOT
    \end{theorem}
    POSTFOOT
  }

因此\UseHooks 不是真正的问题。

经过对\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}

thmtools-comp  

答案1

请注意,该答案不包含任何有效代码。

买者自负 ...


首先,你似乎意识到了,间距不是由你使用钩子引入的。为了看到这一点,我们可以简单地使用

ABC\UseHook{mythm/prehead}\UseHook{mythm/posthead}\UseHook{mythm/prefoot}\UseHook{mythm/postfoot}XYZ

钩子不会增加空间

由此可以明显看出,没有任何钩子增加任何空间。

其次,您提出的“解决方案”将产生许多不良影响。充其量,您将得到令人震惊的印刷输出。(尝试\hrulemytheorem或分段命令或列表之前或...)。

第三,如果“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}

或者显示风格的数学?

或者 ... ?

相关内容