
次の FMWE (Fairly Minimal Working Example) を検討してください。
\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}
このコードから私が期待する出力は
実際の出力は
ドキュメントの本文を変更せずに期待どおりの出力を実現する正しい方法はありますか?
目的の結果を得るには、本文に次の 2 つの変更のいずれかを加えるだけで十分です。
行のコメントを解除する
% \resetindents
行のコメントを解除する
% \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}
最後の2段落でカットを繰り返す
最新のカットが繰り返されることはありません。繰り返されると右側のカットが発生します。重要なのは、繰り返されるカットが 1 つの段落以上にわたることです。
\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
場合は設定が必要になります。この修正は、おそらく今週後半 (2016 年 6 月中旬) の\par
次の更新で反映される予定です。expl3