我对这种方式不满意下标显示为希腊字母 \chi
。这个特定的字母向下偏移了一点。我有时必须在下标前加上前缀,\sciptscriptstyle
这样,实际上,表达式可能看起来像
\sup{\chi_{\scriptscriptstyle A_n}(x)}[n]
在哪里
\RenewDocumentCommand{\sup}{m O{}}{
\operatorname{sup}\ifstrempty{#2}{}{\limits_{\mathclap{\substack{\expandafter{\scriptscriptstyle{#2}}}}}}
\expandafter{#1}
}
(我承认这个代码片段有点混乱,特别是由于可选参数的非规范声明以及通过而不是参数类型O{}
进行测试以及——使用\ifstrempty
o
IfNoValueTF
解析包。我还不完全清楚哪种语法更直接。)
有没有办法重新定义 \chi
保持语法与所有语义等同的概念一致,即字母,但有仅有的 \chi
的下标表达式较小或略低?澄清一下,我正在考虑重新定义下标运算_
符\chi
。但我天真地认为 TeX 的语法不允许我这样做。
一个明显的解决方法是使用不同的语法定义一个新的宏,例如
\newcommand{\Chi}[1]{\chi_{\scriptscriptstyle{#1}}}
所以实际上我想要的就是
\chi_{expr}
哪里expr
呈现较小或偏移较低比默认的要好。
答案1
使用\scriptscriptstyle
不是一个好的印刷设备,因为它会产生不平衡的符号。
这是确保下标向下移动的方法,就像有上标一样。
\documentclass{article}
\usepackage{amsmath,xparse}
\let\latexchi\chi
\makeatletter
\renewcommand\chi{\@ifnextchar_\sub@chi\latexchi}
\newcommand{\sub@chi}[2]{% #1 is _, #2 is the subscript
\@ifnextchar^{\subsup@chi{#2}}{\latexchi^{}_{#2}}%
}
\newcommand{\subsup@chi}[3]{% #1 is the subscript, #2 is ^, #3 is the superscript
\latexchi_{#1}^{#3}%
}
\makeatother
\begin{document}
\noindent
$\latexchi_{A}\chi_{A}$\\[2ex]
$\latexchi_{A_{n}}\chi_{A_{n}}$\\[2ex]
$\chi_{A}\quad\chi_{A}^{2}\quad\chi^{2}_{A}\quad\chi^{2}\quad\chi$
\end{document}
答案2
还有一个可能需要考虑的可能性:重新定义\chi
,以便“数学支柱”的下半部分自动插入到字符之后。(附言:数学支柱是一个宽度为零的 TeX 对象——因此它是不可见的——并且高度和深度为圆括号,即 。 )这样,任何下标的位置都将由组合而不是符号)
决定。由于数学支柱的深度超过了 的深度,因此下标最终将被放置在更低的位置——正如所希望的那样。{\chi\mathstrut}
\chi
\chi
以下解决方案使用amsart
文档类,它会amsmath
自动加载包。对于非 AMS 文档类,请务必加载amsmath
包,以便\smash[t]{...}
宏可用。
\documentclass[a4paper]{amsart}
\makeatletter
\@ifdefinable\@latex@chi{\let\@latex@chi\chi}
\renewcommand*\chi{{\@latex@chi\smash[t]{\mathstrut}}} % want only bottom half of \mathstrut
\makeatletter
\begin{document}
Text before $\chi_{A}$, text after.
Text before $\chi_{S_{i}}$, text after
Another couple of lines of text for testing consistency of the gap between the
baselines. Some more text. Some more text.
\end{document}
输出:
答案3
\documentclass{article}
\usepackage{mathtools}
\newcommand{\mychi}{\raisebox{0pt}[1ex][1ex]{$\chi$}}
\newlength{\temp}
\begin{document}
\[ \textrm{before}\quad \chi_A^2 \quad\textrm{after}\quad \mychi_A^2 \]
\settoheight{\temp}{$\chi$}
\noindent\the\temp\newline
\settoheight{\temp}{\mychi}
\the\temp
\end{document}
您可以根据需要微调 \rasisebox 参数。
答案4
您可以使用的功能xparse
来定义新的下标和上标参数并将它们作为可选参数传递。这里是完整的代码和解释。
基本上,您在搜索和时分别使用a
和参数,然后使用这些参数执行任何您想做的事情。我在这里使用 egreg 的解决方案来向您展示它是多么简单。b
xparse
_{#1}
^{#2}
\let\originalchi\chi
\RenewDocumentCommand\chi{ab}
{\originalchi
\IfValueT{#1}{_{#1}}%
\IfValueTF{#2}{^{#2}}{^{}}}
...
$\originalchi_{A}\chi_{A}$\\[2ex]
$\originalchi_{A_{n}}\chi_{A_{n}}$\\[2ex]
$\chi_{A}\quad\chi_{A}^{2}\quad\chi^{2}_{A}\quad\chi^{2}\quad\chi$
a
and b
(andA{<default>}
和B{<default>}
)的行为与其他xparse
参数完全相同。
这是完整的可编译代码:
\documentclass{scrartcl}
\usepackage{mathtools,xparse}
\ExplSyntaxOn
\cs_new_protected:Npn \__xparse_count_type_k:w #1
{
\__xparse_single_token_check:n { #1 }
\quark_if_recursion_tail_stop_do:Nn #1 { \__xparse_bad_arg_spec:wn }
\__xparse_count_mandatory:N
}
\cs_new_protected:Npn \__xparse_count_type_K:w #1 #2
{
\__xparse_single_token_check:n { #1 }
\quark_if_recursion_tail_stop_do:nn { #2 } { \__xparse_bad_arg_spec:wn }
\__xparse_count_mandatory:N
}
\cs_new_protected:Npn \__xparse_add_type_k:w #1
{ \exp_args:NNo \__xparse_add_type_K:w #1 { \c__xparse_no_value_tl } }
\cs_new_protected:Npn \__xparse_add_type_K:w #1 #2
{
\__xparse_flush_m_args:
\__xparse_add_grabber_optional:N K
\tl_put_right:Nn \l__xparse_signature_tl { #1 { #2 } }
\__xparse_prepare_signature:N
}
\cs_new_protected:Npn \__xparse_add_expandable_type_k:w #1
{
\exp_args:NNo \__xparse_add_expandable_type_K:w #1 { \c__xparse_no_value_tl }
}
\cs_new_protected_nopar:Npn \__xparse_add_expandable_type_K:w #1 #2
{
\__msg_kernel_error:nnx { xparse } { invalid-expandable-argument-type } { K }
\__xparse_add_expandable_type_m:w % May be create this?
}
\cs_new_protected:Npn \__xparse_grab_K:w #1 #2 #3 \l__xparse_args_tl
{
\__xparse_grab_K_aux:NnnNn #1 { #2 } { #3 } \cs_set_protected_nopar:Npn
{ _ignore_spaces }
}
\cs_new_protected:Npn \__xparse_grab_K_long:w #1 #2 #3 \l__xparse_args_tl
{
\__xparse_grab_K_aux:NnnNn #1 { #2 } { #3 } \cs_set_protected:Npn
{ _ignore_spaces }
}
\cs_new_protected:Npn \__xparse_grab_K_trailing:w #1 #2 #3 \l__xparse_args_tl
{
\__xparse_grab_K_aux:NnnNn #1 { #2 } { #3 } \cs_set_protected_nopar:Npn
{ _ignore_spaces }
}
\cs_new_protected:Npn \__xparse_grab_K_long_trailing:w #1 #2 #3 \l__xparse_args_tl
{
\__xparse_grab_K_aux:NnnNn #1 { #2 } { #3 } \cs_set_protected:Npn
{ _ignore_spaces }
}
\cs_new_protected:Npn \__xparse_grab_K_aux:NnnNn #1 #2 #3 #4 #5
{
\exp_after:wN #4 \l__xparse_fn_tl ##1
{
\__xparse_add_arg:n { ##1 }
#3 \l__xparse_args_tl
}
\use:c { peek_meaning_remove #5 :NTF } #1
{ \l__xparse_fn_tl }
{
\__xparse_add_arg:n { #2 }
#3 \l__xparse_args_tl
}
}
\prop_put:Nnn \c__xparse_shorthands_prop { a } { k \sb }
\prop_put:Nnn \c__xparse_shorthands_prop { b } { k \sp }
\prop_put:Nnn \c__xparse_shorthands_prop { A } { K \sb }
\prop_put:Nnn \c__xparse_shorthands_prop { B } { K \sp }
\ExplSyntaxOff
\let\originalchi\chi
\RenewDocumentCommand\chi{ab}
{\originalchi
\IfValueT{#1}{_{#1}}%
\IfValueTF{#2}{^{#2}}{^{}}}
\begin{document}
\noindent
$\originalchi_{A}\chi_{A}$\\[2ex]
$\originalchi_{A_{n}}\chi_{A_{n}}$\\[2ex]
$\chi_{A}\quad\chi_{A}^{2}\quad\chi^{2}_{A}\quad\chi^{2}\quad\chi$
\end{document}