删除多余的花括号

删除多余的花括号

在这篇 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}阻止了该组的分裂。此效果可用于排版序列中的特殊子字符串。

括号具有非常重要的句法意义,不应随意使用。

相关内容