\phantom с всегда правильным интервалом (с учетом его окружения)

\phantom с всегда правильным интервалом (с учетом его окружения)

Я регулярно использую его \phantomдля визуального выравнивания элементов в своих документах, и часто мне приходится вручную заполнять пробелы, которые обрезаются путем удаления атомов (чего я не до конца понимаю) между объектами до и после \phantom--- обычно это работает путем добавления {}' внутри \phantomаргумента, но не всегда.

С помощьюhttps://tex.stackexchange.com/a/95923/42225, я набросал следующее, но мне кажется, что должно быть более элегантное решение, не требующее предшествующих и последующих объектов в качестве аргументов (которые я сделал необязательными).

\documentclass{article}
\usepackage[english]{babel}
\usepackage{amsmath}
\usepackage{xparse}

\makeatletter
\NewDocumentCommand{\archphantom}{O{{}} m O{{}}}{%
    \setbox0\hbox{$#1#2#3$}%
    \setbox1\hbox{$#1{#2}#3$}%
    \dimen@\dimexpr\wd0-\wd1%
    #1\phantom{#2}\kern\dimen@#3%
}
\makeatother

\begin{document}

\begin{align*}
    x & = \fbox{\hspace{5cm}\vphantom{b}}+\ldots\\
    &\archphantom{=}[\ldots] + \fbox{\hspace{5cm}\vphantom{b}} && \text{works}\\
    &\phantom{=}\,\:\ldots + \fbox{\hspace{5cm}\vphantom{b}} && \text{trial $\&$ error}\\
    &\phantom{{}={}}\ldots + \fbox{\hspace{5cm}\vphantom{b}} && \text{doesn't work}
\end{align*}

\end{document}

В этом конкретном случае ( =+ \ldots) мне не удалось смоделировать правильный интервал с помощью eg \phantom{{}={}}\ldots, что побудило меня наконец задать этот вопрос. ;-)

В качестве побочного замечания, я одновременно ищу хорошие предложения по названию для полученной команды (или обратную связь по моему выбору). Сначала я подумал о \phantombridge, так как мне нужно принять во внимание объекты до и после --- метафорически две видимые опоры невидимого моста. Теперь, однако, поскольку арка по сути та же самая концепция, я предпочитаю \archphantom, который также имеет дополнительный оттенок " \phantomболее высокого ранга" (сравните ангела и архангела).

решение1

На интервал влияет математический класс атома и соседних атомов. Обычный трюк с добавлением {}позволяет \mathrelатому оставаться отношением и не превращаться фактически в mathord и не терять интервал, но, как вы заметили, он не всегда получает правильный интервал, если соседние элементы не являются mathord.

Вы можете использовать

\mathrel{\phantom{=}}

который скрывает =и заново утверждает \mathrelкласс.

Можно было бы украсть часть кода из bmпакета, чтобы опрашивать математический класс аргумента и добавлять его \mathrelавтоматически, но я не думаю, что я бы это сделал, это сделало бы код очень хрупким.

Обратите внимание, что если аргумент содержит более одного символа, то в некоторых случаях интервал будет затронут в любом случае, поскольку упаковка любого выражения замораживает эластичный клей на его естественной ширине, тогда как неупакованная версия может быть растянута или сжата, в зависимости от ситуации.

Связанный контент