在这篇 MWE 中,我演示了我的问题:
\documentclass{article}
\usepackage{seqsplit}
\newcommand{\dosomething}[1]{\uppercase{#1}}
\newcommand{\dosomethingelse}[1]{\seqsplit{#1}}
\begin{document}
\dosomething{looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong}
% works with extra {...}
\dosomething{{looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong}}
\dosomethingelse{looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong}
% does not work with extra {...}
\dosomethingelse{{looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong}}
\end{document}
有些命令可以处理额外的花括号,有些则不行。这是为什么?当命令中有额外的花括号时,如何通过预处理参数来使命令正常工作?
答案1
如果参数不为空并且可以删除起始空格,则以下技巧会有所帮助:
\makeatletter
\newcommand{\dosomethingelse}[1]{%
\expandafter\seqsplit\expandafter{\@firstofone#1}%
}
\makeatother
\@firstofone
在 LaTeX 内核中定义为:
\long\def\@firstofone#1{#1}
它抓取第一个标记作为参数并再次输出,因此它“什么也不做”。但如果参数不是单个标记,而是括号中的标记组,则会删除一层括号。
答案2
这主要取决于什么您正在处理的命令。
如果有\textit{{xyz}}
,则附加的括号只会增加一个分组级别;因为\seqsplit
这是一个完全不同的情况,因为此命令一次扫描其参数的一个项目,而括号内的组是一个项目。
手册的seqsplit
第 2.3 节对此进行了描述:
2.3 分组和命令
该命令
\seqsplit
不会在括号内的字母之间插入断点{...}
。[...(省略的例子)...]
周围的括号
{kahg}
阻止了该组的分裂。此效果可用于排版序列中的特殊子字符串。
括号具有非常重要的句法意义,不应随意使用。