为“真实”彩色分隔符定义宏

为“真实”彩色分隔符定义宏

我最近查了一下J. van Hoorn 的问题关于如何在数学模式中为分隔符着色,因此我决定通过尝试定义一个新的合适命令来测试我的 LaTeX 知识:\leftcolor{color}<delim symbol>\rightcolor{color}<delim symbol>

MWE如下:

\documentclass{article}
\usepackage{amsmath}
\usepackage{xcolor}
%
\newcommand*\leftcolor[2]{%
 \color{#1}\left#2\normalcolor%
}
\newcommand*\rightcolor[2]{%
 \color{#1}\right#2\normalcolor%
}
%
\begin{document}
\begin{equation*}
%
\leftcolor{red}(\frac{a}{b}\rightcolor{red})^n \neq \left(\frac{a}{b}\right)^n
%
\end{equation*}
\end{document}

从以下结果中可以看出问题:

在此处输入图片描述

我清楚地看到指数定位是错误的,但我不知道 LaTeX 如何以这种方式放置该符号,因为我遵循了唯一可能的正确着色选项(即使在搜索文档后xcolor我也没有找到任何与此主题相关的内容)。

我的猜测是,定界符的有效大小是“伪造的”,以至于编译器认为将指数作为一个正常大小的定界符而不是扩展定界符更为正确。

我不知道是否有一些普通的 TeX 或 LaTeX 字符串可以帮助解决这种情况,因为在这些情况下最常见的解决方案涉及制作新的分隔符,例如:

\customdelim{\frac{a}{b}}^n   % these commands are not present in this case

事实是我不要求这种宏因为我希望能够通过特定的参数直接从一种颜色切换到另一种颜色。

答案1

\left并将\right其内容放在其自己的组中。

\normalcolor如果您在宏中省略,您会在以下示例中注意到这一点\rightcolor

\leftcolor{blue}( \frac{a}{b} \rightcolor{red})^n

上标n(以及同一组中其后的所有内容)变为蓝色!

以及\set@color调用的内部宏包含,它在和组之后被调用。(因此问题出在和 中。)以下看不到正确的数学原子以进行正确对齐。\color\normalcolor\aftergroup\reset@color\left\right\normalcolor\leftcolor\color\rightcolor^n

在它周围添加另一个组可以反转这种影响并^2正确对齐(见分数 4 和 5)。但是,\left\right是内原子的事实也因此被破坏,因为{}构造了一个普通原子。

TeXbook,第 155 页:

还有第八种分类,\mathinner通常不用于单个符号;分数和\left...\right构造被视为“内部”子公式,这意味着在某些情况下它们将被额外的空间包围。

正确使用重新着色的分隔符将需要而不是第二组 a\mathinner来获得正确的间距。

\p如果您想对分隔符使用不同的颜色,我已经在宏中实现了此功能,该宏采用一个额外的可选参数。

间距的差异用 来显示a

虽然在链接问题上已经说过了,但我想重复一下事实,\normalcolor不会切换回之前的当前颜色,\left而是切换回默认颜色。 A\color{green} a \p{red}(){b} c仍然会显示黑色b和绿色c

代码

\documentclass{article}
\usepackage{mathtools}
\usepackage{xcolor}
\makeatletter
\newcommand*{\p}[5][]{%
  \edef\@tempa{#1}%
  \ifx\@tempa\@empty
    \edef\@tempa{#2}%
  \fi
  \mathinner{\begingroup\color{\@tempa}\left#3\normalcolor#5\color{#2}\right#4\endgroup}
}
\makeatother
\newcommand*\leftcolor[2]{%
 \color{#1}\left#2\normalcolor%
}
\newcommand*\rightcolor[2]{%
 \color{#1}\right#2%
}

\begin{document}
\begin{gather*}
a \p{red}(){\frac{a}{b}}^n \\
a \p[blue]{red}(){\frac{a}{b}}^n \\ 
%
a \left(\frac{a}{b}\right)^n \\
%
%
a \mathinner{{\leftcolor{blue}( \frac{a}{b} \rightcolor{red})}}^n \\
a \leftcolor{blue}( \frac{a}{b} \rightcolor{red})^n \\ % the 'n' is blue not red!
a {{\leftcolor{blue}( \frac{a}{b} \rightcolor{red})}}^n \\ % the spacing is bad
%
a \left(\frac{a}{b}\right)^n
\end{gather*}
\end{document}

输出

在此处输入图片描述 在此处输入图片描述

答案2

为了进行比较,ConTeXt 提供了一个\definemathfence定义彩色分隔符的命令。math-fen.mkiv预定义了一些数学栅栏:

\definemathfence [parenthesis] [\c!left=0x28,\c!right=0x29]
\definemathfence [bracket]     [\c!left=0x5B,\c!right=0x5D]
\definemathfence [braces]      [\c!left=0x7B,\c!right=0x7D]
\definemathfence [bar]         [\c!left=0x7C,\c!right=0x7C]
\definemathfence [doublebar]   [\c!left=0x2016,\c!right=0x2016]
\definemathfence [angle]       [\c!left=0x3C,\c!right=0x3E]

您可以使用\fenced[parenthesis]{ \frac {a}{b} }。要添加颜色,请重载其中一个预定义栅栏(或从头开始),并添加颜色属性。例如:

\definemathfence[colorbracket][parenthesis][color=red, command=yes]

部分定义了可以代替 的command=yes命令。完整示例:\colorbracket\fenced[colorbracket]

\definemathfence[colorbracket][parenthesis][color=red, command=yes]

\starttext

\startformula
  \colorbracket{\frac {a}{b}}^n
  \qquad
  \left( \frac {a}{b} \right)^n
\stopformula

\stoptext

这使

在此处输入图片描述

与所有 ConTeXt\define....命令一样,您可以使用\setup...命令来更改行为。例如,要将颜色从红色更改为蓝色,您可以使用:

\setupmathfence[colorbracket][color=blue]

此命令不支持左右分隔符颜色不同。具体实现请参见math-fen.mkiv

答案3

在考虑了上述有用的评论后(我从来没有想过人们会喜欢海科·奥伯迪克color会花时间回答我唯一的第二个问题!),我添加了从 扩展\@empty到标准的案例的实现black

最终的MWE如下:

\documentclass{article}
\usepackage{amsmath}
\usepackage{mathtools}
\usepackage{xcolor}
%
\makeatletter
%
\newcommand\leftcolor[2]{%
  \edef\@tempa{#1}%
  \ifx\@tempa\@empty
    \edef\@tempa{black}%
  \fi
 \mathinner\bgroup\begingroup\color{\@tempa}\left#2\normalcolor%
}
\newcommand\rightcolor[2]{%
  \edef\@tempa{#1}%
  \ifx\@tempa\@empty
    \edef\@tempa{black}%
  \fi
  \color{\@tempa}\right#2\endgroup\egroup%
}
\makeatother
%
\begin{document}
%
\begin{gather*}
a\leftcolor{red}(\frac{a}{b} \rightcolor{red})^n \left(\frac{a}{a}\right)^n \\
a\leftcolor{}(\frac{a}{b}\rightcolor{})^n \left(\frac{a}{a}\right)^n \\
a\leftcolor{red}(\frac{a}{b}\rightcolor{blue})^n \left(\frac{a}{a}\right)^n \\
\end{gather*}
%
\end{document}

现在最终输出显示正确:

在此处输入图片描述

\mathinner\begingroup\bgroup我还注意到,每个定义中的和函数\endgroup\egroup使代码按 运行\mathinner{{<argument>}}^n,但在我的包中,LyXbasic我将保留该命令奎伯比尔贝尔 建议,因为语法同样流畅:

\p{<left delim color>}{<right delim color>}{<left delim>}{<right delim>}{<argument>}

相关内容