我创建了一个命令,使用和相关包中的命令\myunder
将彩色无衬线文本置于数学表达式下。文本颜色是使用该包实现的。underset
amsmath
xcolor
我想进行修改\myunder
,以便我可以在数学表达式下放置第二行彩色文本。
这是 MWE。不幸的是,正如您在第二个等式中看到的,使用\\
不起作用。
\documentclass{article}
\usepackage[semibold,tt=false]{libertine}
\usepackage{libertinust1math}
\usepackage{xifthen}
\usepackage{xcolor}
\newcommand{\myunder}[3][]{%
\ifthenelse{\isempty{#1}}{\underset{\textsf{#3}}{#2}}{\underset{\textsf{\textcolor{#1}{#3}}}{#2}}%
}
\newcommand{\mylongsymbol}{\Delta\Delta\Delta\Delta\Delta\Delta\Gamma_{\alpha}}
\begin{document}
\begin{equation}
\myunder[red]{\mylongsymbol}{System X} < \myunder[blue]{\mylongsymbol}{System Y}
\end{equation}
\begin{equation}
\myunder[red]{\mylongsymbol}{System X\\X is real.} < \myunder[blue]{\mylongsymbol}{System Y\\Y is imaginary.}
\end{equation}
\end{document}
解决这个问题的最佳方法是什么?
答案1
有趣的问题。
\documentclass{article}
\usepackage[semibold,tt=false]{libertine}
\usepackage{libertinust1math}
\usepackage{xcolor}
%\usepackage{xparse} % not needed with LaTeX 2020-10-01
\ExplSyntaxOn
\NewDocumentCommand{\myunder}{omm}
{% #1 = color, #2 = main symbol, #3 = the underscript
\IfNoValueTF { #1 }
{% no optional argument
\andrew_myunder:nnn { } { #2 } { #3 }
}
{% optional argument should be a color name
\andrew_myunder:nnn { \color{#1} } { #2 } { #3 }
}
}
\seq_new:N \l__andrew_myunder_sub_seq
\cs_new_protected:Nn \andrew_myunder:nnn
{
\__andrew_myunder_split:n { #3 }
\underset
{% the underscript in \underset
#1 % the possible color
\substack
{% add \\ between the items
\seq_use:Nn \l__andrew_myunder_sub_seq { \\ }
}
}
{% the main symbol in \underset
#2
}
}
\cs_new_protected:Nn \__andrew_myunder_split:n
{% split the input at \\
\seq_set_split:Nnn \l__andrew_myunder_sub_seq { \\ } { #1 }
% add \textsf{} around each item
\seq_set_map:NNn \l__andrew_myunder_sub_seq \l__andrew_myunder_sub_seq { \textsf{##1} }
}
\ExplSyntaxOff
\newcommand{\mylongsymbol}{\Delta\Delta\Delta\Delta\Delta\Delta\Gamma_{\alpha}}
\begin{document}
\begin{equation}
\myunder[red]{\mylongsymbol}{System X} < \myunder[blue]{\mylongsymbol}{System Y}
\end{equation}
\begin{equation}
\myunder[red]{\mylongsymbol}{System X\\X is real.} <
\myunder[blue]{\mylongsymbol}{System Y\\Y is imaginary.}
\end{equation}
\huge
\begin{equation}
\myunder[red]{\mylongsymbol}{System X\\X is real.} <
\myunder[blue]{\mylongsymbol}{System Y\\Y is imaginary.}
\end{equation}
\end{document}
首先,我们对参数进行规范化:如果没有给出可选参数,则使用空的第一个参数调用主函数,因此不设置颜色。
第一个强制参数按原样用作 的第二个参数\underset
。第二个强制参数首先在标记处拆分\\
;然后将这样获得的项目转换为\textsf{<item>}
。最后使用该序列重新插入\\
项目之间,全部输入\substack
。
请注意,没有\scriptsize
发出明确的指令,因此\underset
其选择适当字体大小的正常工作也是如此。
答案2
由于您很可能只会在显示数学环境中使用它,因此以下是一个选项:
\documentclass{article}
\usepackage{amsmath}
\usepackage{xcolor}
\newcommand{\myunder}[3][black]{
\underset{\mbox{\scriptsize\color{#1}\sffamily\begin{tabular}{@{}c@{}}#3\end{tabular}}}{#2}
}
\newcommand{\mylongsymbol}{\Delta\Delta\Delta\Delta\Delta\Delta\Gamma_{\alpha}}
\begin{document}
\[
\myunder[red]{\mylongsymbol}{System X} < \myunder[blue]{\mylongsymbol}{System Y}
\]
\[
\myunder[red]{\mylongsymbol}{System X \\ X is real.} < \myunder[blue]{\mylongsymbol}{System Y \\ Y is imaginary.}
\]
\end{document}
没有必要真正限制可选参数的存在,因为您可以在black
需要时打印内容。