我的目标是在输出文档中实现与我在编辑器中使用的语法突出显示类似的着色,以便在编辑和查看文档之间切换变得更容易。
我认为我可以使用该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}
答案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
到适当的位置。