有没有一种正确的方法可以在不修改文档主体的情况下防止样张剪切以后重复?

有没有一种正确的方法可以在不修改文档主体的情况下防止样张剪切以后重复?

考虑以下 FMWE(相当最小的工作示例):

\documentclass[a4paper]{article}
\usepackage{kantlipsum,xgalley}
\usepackage[scale=.8]{geometry}
\pagestyle{empty}
\ExplSyntaxOn
\NewDocumentCommand\resetindents { }
{
  \galley_parshape_set_multi:nnnN { 0 } { 0pt } { 0pt } \c_true_bool
}
\NewDocumentCommand\cutleft { m m }
{
  \galley_cutout_left:nn { #1 } { #2 }
}
\NewDocumentCommand\cutright { m m }
{
  \galley_cutout_right:nn { #1 } { #2 }
}
\ExplSyntaxOff
\begin{document}
% \ExplSyntaxOn
\cutleft{0}{25mm,25mm,25mm,25mm,25mm,25mm,25mm,25mm}
This is an extremely short paragraph.

\kant[4]

\cutright{4}{25mm,25mm,25mm,25mm,25mm,25mm}
\kant[5]
% \resetindents

\kant[6-7]

% \ExplSyntaxOff
\end{document}

我期望此代码的输出是

预期的

实际输出是

实际的

有没有正确的方法可以在不修改文档主体的情况下实现预期的输出?

请注意,对主体进行以下两种修改中的任何一种都足以实现所需的结果:

  1. 取消注释该行

    % \resetindents
    
  2. 取消注释

    % \ExplSyntaxOn
    

    % \ExplSyntaxOff
    

这就是为什么这些行存在于源代码中。

然而,这\resetindents似乎只能真正解决问题,因为下面的例子也给出了实际的、不受欢迎的输出。

\begin{document}
\ExplSyntaxOn
\cutleft{0}{25mm,25mm,25mm,25mm,25mm,25mm,25mm,25mm}
This is an extremely short paragraph.\par
\kant[4]
\cutright{4}{25mm,25mm,25mm,25mm,25mm,25mm}
\kant[5]
% \resetindents
\kant[6-7]
\ExplSyntaxOff
\end{document}

显然,从源代码中删除空行会阻止切换到expl3语法来避免该问题。此外

\begin{document}
\ExplSyntaxOn
\cutleft{0}{25mm,25mm,25mm,25mm,25mm,25mm,25mm,25mm}
This is an extremely short paragraph.\par
\kant[4]\par
\cutright{4}{25mm,25mm,25mm,25mm,25mm,25mm}
\kant[5]\par
% \resetindents
\kant[6-7]\par
\ExplSyntaxOff
\end{document}

也说明了这个问题。

因此\resetindents似乎是必要的,但我思考而船舱的哲学则表明,情况不应该如此。

我很好奇,想知道切割模式是如何确定的。例如,

\begin{document}
\cutleft{0}{25mm,25mm,25mm,25mm,25mm,25mm,25mm,25mm}
This is an extremely short paragraph.\par
\kant[4]

\cutright{4}{25mm,25mm,25mm,25mm,25mm,25mm}

\kant[5-6]

\kant[7]
\end{document}

直到最后一段才重复剪辑

仅限最终版本

尽管

\begin{document}
\cutleft{0}{25mm,25mm,25mm,25mm,25mm,25mm,25mm,25mm}
This is an extremely short paragraph.\par
\kant[4]

\cutright{4}{25mm,25mm,25mm,25mm,25mm,25mm}

\kant[5]

\kant[6]

\kant[7]
\end{document}

在最后两段中重复删减

最后两

在任何情况下都不会重复最近的剪切,因为那会导致右侧剪切。似乎至关重要的是,重复的剪切跨越了多个段落。

\begin{document}
\cutright{0}{25mm,25mm,25mm,25mm,25mm,25mm,25mm,25mm}
This is an extremely short paragraph.
Perhaps we should make it a bit longer just to see what happens to things in that case.\par
\kant[4]

\cutleft{4}{25mm,25mm,25mm,25mm,25mm,25mm}

\kant[5]

\kant[6]

\kant[7]
\end{document}

再次在右边切割

然而,至少这种影响不是累积的。

\begin{document}
\cutright{0}{25mm,25mm,25mm,25mm,25mm,25mm,25mm,25mm}
This is an extremely short paragraph.
Perhaps we should make it a bit longer just to see what happens to things in that case.\par
\kant[4]

\cutleft{4}{25mm,25mm,25mm,25mm,25mm,25mm}
This is another extremely short paragraph.

\kant[5]

\kant[6]

\kant[7]
\end{document}

非累积重复削减

请注意

  • 我非常清楚,这l3galley是实验性的,如果你尝试以各种奇怪而奇妙的方式使用它,它肯定会出问题。把它看作是一次引导式的冒险,带你体验由此产生的一小部分奇怪和奇迹。

  • 我也知道,怪异和惊奇很大程度上取决于旁观者的眼光。我认为出乎意料的效果实际上很可能是开发人员非常看重的设计特点,他们花了很长时间在热键盘上忙碌,拼命地试图让切口按照精确的算法重复,不管它的模式对我来说有多么模糊。TeX 是神秘的(否则如何描述通过小写字母和大写字母的奇怪混合召唤印刷灵魂?)如果这种神秘感在它的后代中完全消失,我会感到失望。

答案1

这是由于 中的一个错误l3galley。在演示中,\parshape设置在顶层,然后剪切在组内“用完”(这里不可见,但存在\kant\par组内)。组之后,\parshape未重置,因为l3galley不需要尝试避免这样做(实际上不存在剪切,也没有设置其他边距或其他任何东西)。

代码现已修改,以检测剪切仍处于“活动”状态,并且\parshape如果\par发生并且不在顶级组级别,则需要设置。此修复将在下一次expl3更新中出现,可能在本周晚些时候(2016 年 6 月中旬)。

相关内容