如何为某些命令/环境着色?

如何为某些命令/环境着色?

我的目标是在输出文档中实现与我在编辑器中使用的语法突出显示类似的着色,以便在编辑和查看文档之间切换变得更容易。

我认为我可以使用该color包来定义一些颜色,然后分别使用和\definecolor设置前景色和背景色。\color{fg}\pagecolor{bg}

我现在想做的是将某些颜色分配给某些命令和环境。对于简单的命令,\emph我可以这样做

\let\oldemph\emph
\renewcommand\emph[1]{{\color{emph}\oldemph{#1}}}

但我还没有弄清楚如何改变环境的颜色align*

关于如何实现这一点,有什么帮助吗?也许甚至有一种通用的方法可以做到这一点,像这样的语义着色包会很酷。

编辑:我设法使用

\usepackage{etoolbox}
\AtBeginEnvironment{align*}{\color{equation}}
\AtBeginEnvironment{align}{\color{equation}}
\AtBeginEnvironment{equation*}{\color{equation}}
\AtBeginEnvironment{equation}{\color{equation}}

可以使用 为 Inline-math 着色\everymath{\color{inlinemath}},但这会覆盖环境的颜色align*equation*但不是环境的颜色)。如何解决这个问题?

编辑:如果我没记错的话,align*-environments 会在数学模式和非数学模式之间切换以获得正确的间距。因此,如果我使用\everymath设置颜色,它将在align*环境中设置,覆盖我对 所做的操作\AtBeginEnvironment。因为equation*它有效,因为只有一个数学块,并且\AtBeginEnvironment会将颜色设置放在里面。我能想到的唯一解决这个问题的方法是,以某种方式仅为 设置颜色$...$,而不是使用\everymath。这可能吗?

答案1

\intertext更新如下:使用此方法处理的一种方式。

通常\everymath只考虑内联,并且有\everydisplay用于显示数学。但是amsmath排版方式很复杂。特别是使用\everydisplay添加\color命令似乎很困难(它在amsmath未加载时有效)。无论如何,这里有一个解决方法:

\documentclass{article}
\usepackage{amsmath}
\usepackage{color}
\usepackage{etoolbox}

\makeatletter
\AtBeginEnvironment{align*}{\let\SetColor\@gobble \color{display}}
\AtBeginEnvironment{align}{\let\SetColor\@gobble \color{display}}
\AtBeginEnvironment{equation*}{\let\SetColor\@gobble \color{display}}
\AtBeginEnvironment{equation}{\let\SetColor\@gobble \color{display}}
\makeatother

% maybe some other nice package has set-up things in \everymath!

\everymath\expandafter{\the\everymath\SetColor{inline}}

\definecolor{display}{rgb}{0,1,0}
\definecolor{inline}{rgb}{0,0,1}

\let\SetColor\color

\begin{document}

$xyz$

\begin{align*}
  E &= mc^2\\
  x^n+y^n&= z^n
\end{align*}

$$hello $$ %% for this we would need \everydisplay
%% but some interference with amsmath makes its use
%% a bit delicate.

\begin{equation}
  E = mc^2
\end{equation}

\end{document}

输出:

彩色数学

更新:在序言中添加上面的代码

\everydisplay\expandafter{\the\everydisplay\SetColor{display}}

会使显示的hello也变成绿色。但请注意,使用 之所以amsmath有效,是因为其环境已在此处修补以消除\SetColor。使用会导致错误。因此,此处的amsmath不会执行任何操作,而是在环境开头插入 来设置颜色。\everydisplay {\color{green}}align*\SetColor\color


处理\intertext。一种可能性。

\documentclass{article}
\usepackage{color}
\usepackage{amsmath}
\usepackage{etoolbox}

\makeatletter
\AtBeginEnvironment{align*}{\let\SetColor\@gobble \color{display}%
                            \Patchintertext}
\AtBeginEnvironment{align}{\let\SetColor\@gobble \color{display}\Patchintertext}
\AtBeginEnvironment{equation*}{\let\SetColor\@gobble \color{display}}
\AtBeginEnvironment{equation}{\let\SetColor\@gobble \color{display}}

\def\Patchintertext{\let\oldintertext@\intertext@
                    \def\intertext@{\oldintertext@\Patchintertext@}}
\def\Patchintertext@ {\let\oldintertext\intertext
                      \def\intertext ##1{\oldintertext
                      {\color{black}\let\SetColor\color ##1}}}
\makeatother


\everymath\expandafter{\the\everymath\SetColor{inline}}
\everydisplay\expandafter{\the\everydisplay\SetColor{display}}

\definecolor{display}{rgb}{.6,.6,.2}
\definecolor{inline}{rgb}{0,0,1}

\let\SetColor\color

\begin{document}

here is some text before with $xyz$ math inline,
\begin{align*}
  E &= mc^2\\
\intertext {this is some intertext with math $a^n+b^n=c^n$ inside,}
  x^n+y^n&= z^n\quad \text{(display)}
\end{align*}
and here is some more text after with again $A^B$ math inline.

$$this is some standard math display$$ 

\begin{equation}
  E = mc^2
\end{equation}

\end{document}

颜色确定B

答案2

请注意,您正在对\color命令进行分组以限制范围。环境也需要这样做。这意味着将\color命令插入环境内部(可能跳过传递给它的任何参数(可选/强制)。所以是的,一般来说,这是可以做到的,但这取决于环境的类型和/或其结构。

对于不接受可选或强制参数的通用环境(包括带星号的版本),你可以使用

在此处输入图片描述

\documentclass{article}
\usepackage{etoolbox,xcolor}% http://ctan.org/pkg/{etoolbox,xcolor}
\newenvironment{myenv}
  {\itshape}
  {}
\begin{document}
Here is some text.

\begin{myenv}
Here is some more text.
\end{myenv}

Here is some text.

\appto{\myenv}{\color{red}}
\begin{myenv}
Here is some more text.
\end{myenv}

Here is some text.
\end{document}

以上app代码结束了to环境启动命令(请注意,环境实际上由...myenv对组成)。但是,如果您的宏采用可选命令,\myenv\endmyenv

\begin{myenv}[<something>]
  % <stuff>
\end{myenv}

那么上述方法可能有效,也可能无效……这取决于你如何定义可选参数的条件。例如,下面的方法不适\appto用于etoolbox

\newenvironment{myenv}[1][\itshape]
  {#1}
  {}

为什么?这完全取决于 TeX 如何/何时读取和评估输入。

在此处输入图片描述

\documentclass{article}
\usepackage{etoolbox,xcolor}% http://ctan.org/pkg/{etoolbox,xcolor}
\newenvironment{myenv}[1][\itshape]
  {#1}
  {}
\begin{document}
Here is some text.

\begin{myenv}
Here is some more text.
\end{myenv}

Here is some text.

\appto{\myenv}{\color{red}}
\begin{myenv}
Here is some more text.
\end{myenv}

Here is some text.

\begin{myenv}[\bfseries]
Here is some more text.
\end{myenv}

Here is some text.
\end{document}

从上面的例子可以看出,[\bfseries](的可选参数myenv)按原样读取,甚至不将其视为可选参数,因为它会打印[],在斜体大胆的(第二个])。插入方式\appto会干扰可选参数,因此必须在稍后插入。为此,如果需要,可以使用etoolbox's \AtBeginEnvironment,或者创建一个伪环境,将其自身包装在原始环境中,传递适当的选项/参数并将命令插入\color到适当的位置。

相关内容