
Я не знаю, действительно ли это хорошая идея или нет, но мне интересно, можно ли реализовать версию, в \frac
которой числитель и знаменатель можно будет выровнять на вкладке выравнивания ( &
).
На этом сайте есть много вопросов о выравнивании дробей, и наиболее очевидным решением во многих случаях является использование \hfill
. Но рассмотрим дробь вроде этой:
Верхний выглядит, на мой взгляд, немного грязно, но использование \hfill
перемещает числитель слишком далеко влево. Что я действительно хочу (я думаю), так это выровнять их точно по открытой скобке. Поэтому я представляю себе команду, \alignedfrac
которая позволила бы мне написать
\[
\alignedfrac{q&(x\mid y)}{p_\mathrm{foo}&(w\mid x,y,z)}
\]
и выровняйте числитель и знаменатель по &
символам.
Я понимаю, что это может быть хорошим выбором, а может и нет, и что я, скорее всего, решаю несущественную проблему, но все же мне интересно, возможно ли реализовать что-то подобное.
Вот MWE, создающий изображение выше:
\documentclass{article}
\begin{document}
\noindent without any alignment:
\[
\frac{q(x\mid y)}{p_\mathrm{foo}(w\mid x,y,z)}
\]
using hfill:
\[
\frac{q(x\mid y)\hfill}{p_\mathrm{foo}(w\mid x,y,z)}
\]
\end{document}
решение1
Здесь я строю левую часть frac ( \leftfrac
) и правую часть ( \rightfrac
) независимо, используя \hfill
s для достижения частичных выравниваний. Затем я набираю обе рядом, с отрицанием \mkern
между ними.
По предложению Мико, для лучшего восприятия вхождения |
были заменены на .\mid
ОТРЕДАКТИРОВАНО для добавления \vphantom
соответствия, что, как я считаю, поможет, если левая и правая части имеют разную вертикальную протяженность.
\documentclass{article}
\begin{document}
\newcommand\alignedfrac[2]{%
\leftfrac#1\\#2\relax\mkern-4.5mu\rightfrac#1\\#2\relax
}
\def\leftfrac#1\\#3\relax{%
\frac{\hfill#1\vphantom{#2}}{\hfill#3\vphantom{#4}}}
\def\rightfrac#1\\#3\relax{%
\frac{\vphantom{#1}#2\hfill}{\vphantom{#3}#4\hfill}}
\noindent without any alignment:
\[
\frac{q(x\mid y)}{p_\mathrm{foo}(w\mid x,y,z)}
\]
using hfill:
\[
\frac{q(x\mid y)\hfill}{p_\mathrm{foo}(w\mid x,y,z)}
\]
using alignedfrac
\[
\alignedfrac{q&(x\mid y)}{p_\mathrm{foo}&(w\mid x,y,z)}
\]
\end{document}
решение2
Ты можешь это сделать:
\documentclass{article}
\usepackage{amsmath}
\makeatletter
\newcommand{\alignedfrac}[2]{%
\begingroup
\setbox0=\vbox{%
\m@th
\ialign{&$\displaystyle##$\cr#1\cr#2\cr}%
\setbox2=\lastbox
\hbox{%
\unhbox2
\unskip
\setbox4=\lastbox
\unskip
\setbox6=\lastbox
\global\dimen1=\wd6
\global\dimen3=\wd4
}
}
\frac{\af@make#1\@nil}{\af@make#2\@nil}
\endgroup
}
\def\af@make#1\@nil{%
\makebox[\dimen1][r]{$\displaystyle#1$}%
\makebox[\dimen3][l]{$\displaystyle#2$}%
}
\makeatother
\begin{document}
\begin{gather*}
\alignedfrac{q&(x\mid y)}{p_\mathrm{foo}&(w\mid x,y,z)} \\
\frac{q(x\mid y)}{p_\mathrm{foo}(w\mid x,y,z)}
\end{gather*}
\end{document}
В чем дело? Я делаю выравнивание с примитивом \halign
, а затем проверяю его последний ряд, разбирая построенный ящик. Я сохраняю размеры двух частей и использую их для создания ящиков нужной ширины.
Однако я не вижу никаких улучшений по сравнению со стандартной дробью, что наглядно показано на изображении.