我想用 LaTeX3 定义一个环境,在其中我可以抑制第一行的缩进。对于 LaTeX2e,您可以使用\@afterindentfalse\@afterheading
。
示例使用了这种组合。但我想避免这种组合。
\documentclass{scrartcl}
\usepackage{lipsum}
\usepackage{expl3,xparse}
\makeatletter
\def\tempaaaa{\@afterindentfalse\@afterheading}
\makeatother
\ExplSyntaxOn
\box_new:N \l_fullwidth_store_contents_one_box
\DeclareDocumentEnvironment { fullwidth } { }
{
\par\noindent Starting~savebox
\vbox_set_inline_begin:N \l_fullwidth_store_contents_one_box
\tempaaaa
}
{
\vbox_set_inline_end:
\par The~Output:\par
\fbox{ \box_use_clear:N \l_fullwidth_store_contents_one_box }
}
\ExplSyntaxOff
\begin{document}
\begin{fullwidth}
FOO bar
\lipsum[1]
\end{fullwidth}
\end{document}
答案1
正如 Bruno 所说,处理样稿问题并不像处理低级代码那样复杂。还有一个问题是,使用 LaTeX2e 改变样稿操作的实现方式并不是一个“完全安全”的操作:你根本无法确定更改不会影响现有代码。因此,使用 LaTeX3-in-LaTeX2e 需要混合使用 LaTeX3 和 LaTeX2e 代码。(例如,了解如何siunitx
使用 LaTeX2e 的 NFSS 检测字体。)
该xgalley
软件包几乎可以流畅运行,但可能仍需要进行一些更改。对于当前的实现(我很乐意收到反馈),您需要类似
\documentclass{article}
\usepackage{lipsum,expl3,xparse,xgalley}
\ExplSyntaxOn
\box_new:N \l_fullwidth_store_contents_one_box
\DeclareDocumentEnvironment { fullwidth } { }
{
\par\noindent Starting~savebox
\vbox_set_inline_begin:N \l_fullwidth_store_contents_one_box
\bool_gset_true:N \g_galley_omit_next_indent_bool
}
{
\vbox_set_inline_end:
\par The~Output:\par
\fbox{ \box_use:N \l_fullwidth_store_contents_one_box }
}
\ExplSyntaxOff
\begin{document}
\begin{fullwidth}
FOO bar
\lipsum[1]
\end{fullwidth}
\end{document}
理想情况下,\noindent
定义为
\bool_gset_true:N \g_galley_omit_next_indent_bool
何时xgalley
加载。但是,人们依赖于\noindent
原始离开垂直模式的事实,因此这种变化会破坏很多 LaTeX2e 代码。一旦我们有了分段模块,也许我可以改变这一点,但目前还不行。