智能括号?

智能括号?

有没有办法巧妙地嵌套括号和方括号(在文本模式下),以便 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}


结果

<code>\enparen</code> 的示例代码

答案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}

在此处输入图片描述

相关内容