我正在使用该soul
包来生成“分布式”文本。也就是说,文本会自动间隔开来,填满整行。这很好用,但现在我想做的是\newcommand
在此上下文中使用,这样我就可以从源文件中删除冗余。
\documentclass{article}
\usepackage{soul}
\sodef\distribute{}{0pt plus 1fil}{0pt plus 2fil}{0pt}
\newcommand{\greeting}{Hello, World!}
\begin{document}
\distribute{\greeting}
\end{document}
如果用文字替换\greeting
,\distribute
则效果很好。但是,用\greeting
会导致“重建失败”错误。soul
文档说这是由于“分组连字符材料”或“泄漏字体开关”造成的。前者可以用 解决\mbox
,但这会阻止字母间距的发生;后者对我来说意义不大,但我认为它不适用于此处。
有没有办法获取包含变量的线宽分布字母间距?
A类似问题回答是“使用microtype
”。但是,这个包看起来相当低级,我不确定从哪里开始才能实现我的目标。
答案1
您可以使用 expl3 构造\exp_args
,它在执行宏之前扩展参数。请参阅宏调用之前扩展参数例如。
梅威瑟:
\documentclass{article}
\usepackage{xparse}
\usepackage{soul}
\sodef\distribute{}{0pt plus 1fil}{0pt plus 2fil}{0pt}
\newcommand{\greeting}{Hello, World!}
\ExplSyntaxOn
\NewDocumentCommand{\expdistribute}{m}{%
\exp_args:No\distribute{#1}%
}
\ExplSyntaxOff
\begin{document}
\expdistribute{\greeting}
\distribute{Hello, World!}
\distribute{All your base are belong to us}
\end{document}
结果: