如何创建自动转义花括号的命令?

如何创建自动转义花括号的命令?

我如何创建一个可以自动转义当前环境中所有花括号的命令?

例如,我想要一个命令(或者环境,我想)允许我写如下内容:

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的含义(这样做可能会很危险),而是}想使用DeclarePairedDelimetermathtools包装如下:

\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

这更像是一个概念验证,而不是一种值得推荐的方法来做你想做的事情。我会坚持\DeclarePairedDelimitercmhughes 概述的道路。然而,它在这里:

\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

在此处输入图片描述

相关内容