我想实现一个类似于 的符号\Pi
,但两条腿交叉,就像 一样\mathrm{X}
。换句话说,我希望 中的条形图\overline{\mathrm{X}}
稍微向下移动一点,将其放置在\mathrm{X}
。这是我目前使用代码实现的移动 hbar 上的栏:
\documentclass{article}
\usepackage{mathtools}
\usepackage{xparse}
\makeatletter
\newcommand{\raisemath}[1]{\mathpalette{\raisem@th{#1}}}
\newcommand{\raisem@th}[3]{\raisebox{#1}{$#2#3$}}
\makeatother
\NewDocumentCommand{\crossedPi}{}{
\ensuremath{\mathrlap{\raisemath{-1.6pt}{
\overline{\phantom{\mathrm{X}}}}}\mathrm{X}}}
\begin{document}
$\Pi \crossedPi$ \\
$\mathrm{Set}_{\Pi} \mathrm{Set}_{\crossedPi}$
\end{document}
正常位置上的符号\crossedPi
看起来正如我想要的那样,但是当符号在索引位置使用时,就像这样\mathrm{Set}_{\crossedPi}
,条形图就会移位。
什么是以稳健的方式实现此符号的完美专业方法,以便在索引位置使用时不会出现任何异常?
答案1
\documentclass{article}
\usepackage{mathtools}
\makeatletter
\DeclareRobustCommand{\crossedPi}{%
{\mathpalette\loweroverline{\mathrm{X}}}%
}
\newcommand{\loweroverline}[2]{%
\sbox\z@{$\m@th#1#2$}%
\dimen@=0.8\fontdimen 8
\ifx#1\displaystyle\textfont\else
\ifx#1\textstyle\textfont\else
\ifx#1\scriptstyle\scriptfont\else
\scriptscriptfont\fi\fi\fi 3
\ooalign{%
\vrule width 0.95\wd\z@ height \ht\z@ depth \dimexpr \dimen@-\ht\z@\relax\cr
\hidewidth\box\z@\hidewidth\cr
}%
}
\makeatother
\begin{document}
$\Pi \crossedPi \Pi \scriptstyle \Pi\crossedPi\Pi$
$\mathrm{Set}_{\Pi} \mathrm{Set}_{\crossedPi}$
\end{document}
上划线的粗细是相应样式中分数粗细的分数。
不同的字体可能需要不同的数字。
答案2
\documentclass{article}
\usepackage{stackengine,scalerel}
\newcommand\crosspi{\ThisStyle{\ensurestackMath{%
\stackengine{-.30pt}{\SavedStyle\mathrm{X}}{%
\rule{\dimexpr1.2\LMex+.3ex}{.31pt}\kern\dimexpr.2\LMpt+.1pt}{O}{c}{F}{F}{S}}}}
\begin{document}
$\Pi \crosspi \Pi \scriptstyle \Pi\crosspi\Pi$
$\mathrm{Set}_{\Pi} \mathrm{Set}_{\crosspi}$
\end{document}
正如 egreg 指出的那样,不同的字体需要对参数进行调整。