
Я хотел бы выровнять по левому краю два узла, которые содержат текст разного размера, так, чтобы точный левый край маленького текста был выровнен по точному левому краю большого текста. Я обнаружил, что между ними есть небольшой, но заметный зазор:
Мне бы хотелось получить что-то вроде этого, что было получено путем открытия 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}