在段落末尾添加带有 \hbox:n 的文本

在段落末尾添加带有 \hbox:n 的文本

这是我之前关于LaTeX3\hbox:n行为。我试图通过\par在段落中间重新定义来自动在段落末尾添加文本。这与我试图破解endfloat处理段落中间的浮动,因为我想自动排序浮动

即使如此,我仍可以将问题简化为简单的 MWE

\documentclass{article}
\usepackage{expl3}

% For my actual use case
\usepackage[backref = true]{enotez}
\usepackage{hyperref}
\usepackage{endfloat}

\makeatletter
\def\foo{\def\par{Hello World\global\let\par\@@par\par}}
\makeatother

\begin{document}

A \foo\hbox{B} C

A \foo\ExplSyntaxOn\hbox:n{B}{}\ExplSyntaxOff C

A\foo\endnote{B}C

The full actual use case is that 

A
\begin{figure}
MY FIGURE
\end{figure}
B

is wrong since I want ``figure about here'' to be at the end of the paragraph and not between A and B

This fixes the problem

\makeatletter
\renewcommand{\floatplace}[1]{%
  \gdef\par{%
    \global\let\par\@@par%
    \par%
    %\begin{center}%
      [\csname #1name\endcsname~\csname thepost#1\endcsname\ about here.]%
    %\end{center}%
    \par%
  }%
}
\makeatother

A
\begin{figure}
MY FIGURE
\end{figure}
B

but then things get broken again with the endnote

A
\begin{figure}
MY FIGURE
\end{figure}
B\endnote{broken again}C


\end{document}

在构造中,\hbox:n我希望额外的文本“Hello World”位于段落的末尾(就像构造一样\hbox)。

A\foo\endnote{B}C我的实际用例与加载enotez和包的情况非常相似hyperref。我可能天真地认为,如果我可以将文本移动到包含的段落的末尾\hbox:n,那么我的实际用例也将起作用。

答案1

LaTeX 2e 对于如何\par局部修改以实现特殊效果有一些内部假设。对其进行全局分配最终会在某种情况下造成很多麻烦(使用不同设置的元素嵌套,然后被完全破坏)。

通过重新定义来捕获当前段落的结尾的想法\par很有趣,但由于嵌套的复杂性,\par即使我们处于该段落的中间,也不能依赖当前段落的结尾是我们看到的下一个命令。 的问题\hbox:n只是一个例子,很容易构造出许多其他任意的例子。 因此,改变它的实现并不能解决问题(尽管出于其他原因,这可能是明智的 :-) )。

至于“有没有办法跳到段落末尾?”这个问题,答案取决于这里的意思。跳到前面,不是真的,但可能是大小控制。我不能 100% 确定它的可靠性。

基本上,eTeX 为我们提供了 \currentgrouplevel 来检查我们当前处于哪个分组级别。因此,假设我们实际上位于我们想要找到结尾的段落内,那么我们可以记录当前的分组级别和当前的定义,\par然后\par以首先检查分组级别然后根据找到的内容采取行动的方式进行更改:

  • 如果分组级别与我们开始的级别相同,我们应该已经到达当前段落的末尾,我们应该做任何我们想做的事情(恢复到\par原来的定义之后!)
  • 如果分组级别较高,则我们处于某个内部对象中,并且我们应该执行已保存的定义,\par因为这不是段落的结尾。请注意,如果内部对象本身已更改,则我们的测试将不适用,一切也都很好。
  • 如果分组级别较低,我们就会以某种方式搞砸(因为理论上这是不可能的)

我想,如果尝试实现这样的功能的话,这大概就是我所走的方向。

相关内容