![如何创建自动转义花括号的命令?](https://linux22.com/image/261694/%E5%A6%82%E4%BD%95%E5%88%9B%E5%BB%BA%E8%87%AA%E5%8A%A8%E8%BD%AC%E4%B9%89%E8%8A%B1%E6%8B%AC%E5%8F%B7%E7%9A%84%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
我如何创建一个可以自动转义当前环境中所有花括号的命令?
例如,我想要一个命令(或者环境,我想)允许我写如下内容:
Kuratowski identified the ordered pair $\langle x,y \rangle$ with the set $\{\{x \},\{x,y\}\}$ whereas Wiener identified it with the set $\{\{x,\emptyset\},\{y\}\}$.
无需输入所有令人讨厌的\
' 来摆脱花括号。
有没有一种简单(并且希望是通用的)的解决方法?当我知道我将在接下来的几行(或当前环境)中使用大量集合论符号时,我想要一种可以让我自动转义花括号的方法。
答案1
与其弄乱{
它的解释,不如定义一个命令,该命令采用逗号分隔的参数列表,并将每个参数括在括号中。以下一些变体取决于您是否希望在外部列表周围使用括号,以及是否需要逗号分隔符。(请注意后面#1
需要空格,否则作为单个参数的括号组的情况{a,b,c}
不起作用,因为 TeX 会删除括号。
\documentclass{article}
\makeatletter
\def\sets#1{\@for\tmp:=#1 \do{\{\tmp\}}}
\def\setsb#1{\{\@for\tmp:=#1 \do{\{\tmp\}}\}}
\def\setsc#1{\def\sep{\def\sep{,}}\@for\tmp:=#1 \do{\sep\{\tmp\}}}
\def\setsd#1{\{\def\sep{\def\sep{,}}\@for\tmp:=#1 \do{\sep\{\tmp\}}\}}
\makeatother
\begin{document}
$\sets{a,b,c}$ $\sets{a,{b,c}}$ $\sets{{a,b,c}}$
$\setsb{a,b,c}$ $\setsb{a,{b,c}}$ $\setsb{{a,b,c}}$
$\setsc{a,b,c}$ $\setsc{a,{b,c}}$ $\setsc{{a,b,c}}$
$\setsd{a,b,c}$ $\setsd{a,{b,c}}$ $\setsd{{a,b,c}}$
\end{document}
答案2
{
您可能不想改变and的含义(这样做可能会很危险),而是}
想使用DeclarePairedDelimeter
mathtools
包装如下:
\DeclarePairedDelimiter\myset{\{}{\}}
然后可以用作$\myset{x}$
或,如下所示,$\myset{\myset{x},y}$
\documentclass{article}
\usepackage{mathtools}
\DeclarePairedDelimiter\myset{\{}{\}}
\begin{document}
\subsection{Original}
Kuratowski identified the ordered pair $\langle x,y \rangle$
with the set $\{\{x \},\{x,y\}\}$ whereas Wiener identified
it with the set $\{\{x,\emptyset\},\{y\}\}$.
\subsection{New}
Kuratowski identified the ordered pair $\langle x,y \rangle$
with the set $\myset{\myset{x},\myset{x,y}}$ whereas Wiener identified
it with the set $\myset{\myset{x,\emptyset},\myset{y}}$.
\end{document}
如果您发现需要将此命令用于分数或其他需要\left
和的内容\right
,则只需使用(例如)\myset*{\frac{a}{b}}
答案3
LuaTeX 来帮忙了。没有 catcode 诡计,你读代码就能理解 :)
我用 ConTeXt 编写了示例,因为我更熟悉它,但类似的方法也可以在 LaTeX 中使用。
\unprotected\unexpanded\def\escapebraces#1%
{\ctxlua{thirddata.escapebraces(\!!bs\detokenize{#1}\!!es)}}
\startluacode
thirddata = thirddata or {}
thirddata.escapebraces = function (data)
context(data:gsub("([{}])", "\\%1"))
end
\stopluacode
\starttext
The power set of $\escapebraces{ {x, y} }$ is $\escapebraces{ {\emptyset, {x}, {y}, {x,y} } }$
\stoptext
给出
答案4
这更像是一个概念验证,而不是一种值得推荐的方法来做你想做的事情。我会坚持\DeclarePairedDelimiter
cmhughes 概述的道路。然而,它在这里:
\documentclass{article}
\usepackage{xparse,l3regex}
\ExplSyntaxOn
\NewDocumentCommand{\escapebraces}{m}
{
\tl_set:Nn \l_tmpa_tl { #1 }
\regex_replace_all:nnN { \cB. } { \c{lbrace} \c{use:n} \cB\{ } \l_tmpa_tl
\regex_replace_all:nnN { \cE. } { \cE\} \c{rbrace} } \l_tmpa_tl
\l_tmpa_tl
}
\ExplSyntaxOff
\begin{document}
Kuratowski identified the ordered pair $\langle x,y \rangle$ with the set
$\escapebraces{ {{x},{x,y}} }$ whereas Wiener identified it with the set
$\escapebraces{ {{x,\emptyset},{y}} }$.
\end{document}
限制:不能使用带有参数的宏\escapebraces
,也不能使用括号中的下标或上标。对于这些,您可以使用\bgroup
和\egroup
,因此
$\escapebraces{ {x_\bgroup11\egroup,x_\bgroup12\egroup} }$
可以。请不要尝试使用\sqrt\bgroup12\egroup
。