这是我之前关于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
因为这不是段落的结尾。请注意,如果内部对象本身已更改,则我们的测试将不适用,一切也都很好。 - 如果分组级别较低,我们就会以某种方式搞砸(因为理论上这是不可能的)
我想,如果尝试实现这样的功能的话,这大概就是我所走的方向。