有没有办法巧妙地嵌套括号和方括号(在文本模式下),以便 LaTeX 检测嵌套关系并相应地排版它们?我在想类似csquotes
使用引号的方法。比如:
\enparent{My outer layer \enparent{my inner lever \enparent{my innermost level}}}
结果是:
(My outer layer [my inner level {my innermost level}])
我想知道是否已经有一个现成的解决方案来解决这个问题。
答案1
一个包?下面的简单宏可以实现它:
\documentclass{article}
\newcount\smcount
\def\smart#1{\ifcase\smcount(\or[\or\{\else TOO DEEP!\fi%
\advance\smcount by1 #1\ifcase\smcount\or)\or]\or\}\else TOO DEEP!\fi%
\advance\smcount by-1 }
\begin{document}
\smart{Ala \smart{ma \smart {kota}}}
\end{document}
(或者,如果你愿意,也可以是 不是\smart
但是\enparent
)。用法:
\smart{Ala \smart{ma \smart {kota}}}
答案2
为了进行比较,我发布了一个 ConTeXt 解决方案。
这样的宏已经存在,尽管是用于引号的。ConTeXt 的优点之一是,它从来不会一次性定义一个功能。例如,ConTeXt 不会定义一个根据嵌套级别更改引号符号的引号宏,而是定义一个通用delimitedtext
机制,而引号是分隔文本的一个特例。所需的括号宏也是一个分隔文本,其中左右符号会根据嵌套级别而变化。因此,使用分隔文本定义此宏,如下所示:
\definedelimitedtext[parenthesis] [location=text]
\setupdelimitedtext [parenthesis:1] [left={(}, right={)}]
\setupdelimitedtext [parenthesis:2] [left={[}, right={]}]
\setupdelimitedtext [parenthesis:3] [left={\{},right={\}}]
这可以用作
\starttext
\parenthesis{My outer layer \parenthesis{my inner layer \parenthesis{my innermost layer}}}
\stoptext
这使
答案3
这种方法比 alexurba 的方法更加模块化,可以适应无限级别的嵌套。
\makeatletter
\def\@enparen#1{\bgroup\let\enparen\@@enparen(#1)\egroup}
\def\@@enparen#1{\bgroup\let\enparen\@@@enparen[#1]\egroup}
\def\@@@enparen#1{\bgroup\let\enparen\@enparen\{#1\}\egroup}
\let\enparen\@enparen
\makeatother
样本
\enparen{one \enparen{two \enparen{three \enparen{four} levels} levels} level}
结果
答案4
可能是嵌套定义:
\documentclass{article}
\newcommand{\enparent}[1]{{%
\def\enparent##1{{\def\enparent####1{\{####1\}}[##1]}}(#1)%
}}
\begin{document}
\noindent
\enparent{My outer layer \enparent{my inner lever \enparent{my innermost level}}}\\
\enparent{My outer layer \enparent{my inner lever \enparent{my innermost level}}}
\end{document}