以下代码按我的预期运行:给定布尔值的状态,某些内容将被打印或不打印。如果不打印,则我冒着创建多余空白的风险。因此,我习惯\ignorespaces
避免这种情况。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\bool_new:N \g__ace_show_content_bool
\bool_gset_true:N \g__ace_show_content_bool
\NewDocumentCommand{\mycommand}{ m }
{
\bool_if:NTF \g__ace_show_content_bool
{
#1
}
{
\ignorespaces
}
}
\NewDocumentCommand{\togglestate}{ }
{
\bool_if:NTF \g__ace_show_content_bool
{ \bool_gset_false:N \g__ace_show_content_bool }
{ \bool_gset_true:N \g__ace_show_content_bool }
}
\ExplSyntaxOff
\pagestyle{empty}
\begin{document}
\textbf{Line 1:} Testing \mycommand{This} \mycommand{is} \mycommand{my} \mycommand{trial} \mycommand{run.} Testing
\togglestate
\textbf{Line 2:} Testing \mycommand{This} \mycommand{is} \mycommand{my} \mycommand{trial} \mycommand{run.} Testing
\togglestate
\textbf{Line 3:} Testing \mycommand{This} \mycommand{is} \mycommand{my} \mycommand{trial} \mycommand{run.} Testing
\end{document}
看来 LaTeX3 已经实现了大部分普通 TeX 的功能。所以,在我看来,像 这样的普通 TeX 代码实际上并不属于 LaTeX3 上下文。但我在 LaTeX3 文档中\ignorespaces
找不到\unskip
和的等价物。\ignorespaces
我是不是漏掉了什么?还有其他解决方法吗?还是说这个方法还没有实现?
答案1
它们都不\unskip
是\ignorespaces
普通的 TeX 命令,它们实际上是 TeX 原语,因此存在于普通 TeX 和 LaTeX2e 中。
因此,的重命名和标准化方法expl3
将它们映射到名称\tex_unskip:D
和\tex_ignorespaces:D
。是的,:D
命令意味着不是在内核或核心软件包之外使用。这个想法是,任何为程序员提供的东西都是在更高层次的抽象上提供的。例如,\tex_relax:D
(原语\relax
)是\scan_stop:
为普通编程任务提供的。有些:D
命令根本不直接提供,因为更高层次的概念更好、更充分。
话虽如此,但 expl3 模块中还有一些领域尚未完成甚至尚未开始,“文本排版”就是其中之一。处理列表中的粘连和空格是此类模块最终需要处理的任务之一。
所以问题是如何处理这个问题:
:D
要么你现在使用 expl3名称- 或者你现在使用 TeX 原始名称
- 或者你自己发明名字,通过
\cs_set_eq:NN
两者都不完美,但我会投票反对 1。并建议你始终遵守不要使用名称的状态:D
,并且不要在实际代码中使用它们。
最简洁的解决方案可能是使用 3。并将您认为必要但尚未涵盖的所有命令放在代码顶部附近的一个地方。这样,一旦模块(例如“排版”和操作水平列表)最终出现,您就知道要重新访问哪些部分。