Горизонтально выравниваемый текст разных размеров

Горизонтально выравниваемый текст разных размеров

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

введите описание изображения здесь

Мне бы хотелось получить что-то вроде этого, что было получено путем открытия PDF-файла в Inkscape и использования инструмента выравнивания:

введите описание изображения здесь

Небольшая разница, конечно; но я придирчив. Есть ли лучший способ выровнять текст как таковой, чем делать это вручную?

Приведенный выше пример был сгенерирован с помощью следующего кода:

\documentclass{article}

\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
    \usetikzlibrary{positioning}

    \node[anchor=text] (largetext) {
        \Huge Large text.};
    \node[below=.4cm of largetext.text, anchor=text] (smalltext) {
        \large small text.};

    \draw[red] (largetext.text) ++ (0,.7) -- (smalltext.text);
\end{tikzpicture}

\end{document}

решение1

Это не удовлетворительный ответ, а скорее схема:

Идея в том, что ТикZ ожидает, что пользователи будут передавать команды шрифтов с помощью font =и node font =. Эти команды сохраняются в \tikz@textfontи \tikz@node@textfontдля последующего использования. Так что по крайней мере эту часть можно автоматизировать.

После того, как желаемое смещение рассчитано, есть два пути

  • сместите узел, просто передав его xshift = -offset; это повлияет на якоря для будущего позиционирования.
  • добавить отрицательные склейки; это можно сделать, переопределив \tikz@text@action. Фактически, эта команда переопределяется, если пользователь передает text ragged leftили любой стиль выравнивания текста.

Теперь, обернув все, что вы сделали, в ключ стиля. Если вам нужны разные смещения для разных начальных букв, вы можете определить стиль с аргументом(ами).


В следующем примере я использовал двойной кернинг между Aи Vв качестве смещения. Я не говорю, что это правильно. Но \XeTeXglyphboundsэто может не дать вам правильного результата. Причина та же, почему нам нужноперелет).


\documentclass[tikz]{standalone}
\usepackage{fontspec}
\setmainfont{Futura}

\begin{document}

\makeatletter
\tikzset{
    distil kerning/.code={%
        \let\oldtempselectfont\pgfmath@selectfont%
        \def\pgfmath@selectfont{\tikz@node@textfont\tikz@textfont\oldtempselectfont}
        \pgfmathsetmacro\pgfkerningcorrection{width("V")+width("A")-width("VA")}
        \xdef\pgfkerningcorrection{\pgfkerningcorrection}
        \let\pgfmath@selectfont\oldtempselectfont
    },
    node correction by kerning/.style={
        distil kerning,
        xshift=-\pgfkerningcorrection*2
    },
    ncbk/.style=node correction by kerning
}
\makeatother

\tikz\draw foreach\A[count=\i]in{A,...,G}{(0,\i*\i/7)node[right,font=\fontsize{\i0}{0}\selectfont,ncbk]{\A: text of size \i0.}};
\tikz\draw foreach\A[count=\i]in{A,...,G}{(0,\i*\i/7)node[right,font=\fontsize{\i0}{0}\selectfont     ]{\A: text of size \i0.}};

\end{document}

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