TikZ 样式使用 \settoheight 设置相对于字母高度的比例

TikZ 样式使用 \settoheight 设置相对于字母高度的比例

我希望有一种样式,使我的绘图与大写字母的高度完全相同,以便在文本行中绘制内容,即使绘图命令用于具有不同字体或大小的文本块(例如,脚注或目录)。我希望避免使用或之类的度量,em因为ex它们相对于大写字母的定义在字体之间不一致(请参阅大写字母的局部高度是多少?)。

获取大写字母的高度适用于\settoheight,但不适用于 内部\tikz[<styles>]。我猜这是因为 TikZ 解析器将字体设置为 nullfont 或类似的东西。将整个\tikz命令包装在宏中是可行的,但使用实际的 TikZ 样式来实现相同效果会更好。可以这样做吗?

示例代码的输出

\documentclass{article}
\usepackage{tikz}

\newdimen\myLetterHeight
\tikzset{
    scale to letter height/.code={%
        \settoheight{\myLetterHeight}{#1}%
        \pgfkeysalso{/tikz/x=\myLetterHeight, /tikz/y=\myLetterHeight, baseline=0pt}%
    },
}
\newcommand*{\TikzScaleToLetterHeight}[2][X]{\begingroup%
    \settoheight{\myLetterHeight}{#1}%
    \pgfkeysalso{/tikz/x=\myLetterHeight, /tikz/y=\myLetterHeight, /tikz/baseline=0pt}%
    #2%
\endgroup}

\begin{document}
WITH KEY: \tikz[scale to letter height=X]
    \draw rectangle (1,1) node[right] {\the\myLetterHeight};

WITH MACRO: \TikzScaleToLetterHeight[X]{\tikz
    \draw rectangle (1,1) node[right] {\the\myLetterHeight};}

{\Large Large: \TikzScaleToLetterHeight[X]{\tikz
    \draw rectangle (1,1) node[right] {\the\myLetterHeight};}}
\end{document}

答案1

尝试此代码进行样式定义。

A

测量答案后面字母的高度使用盒子的高度pgf其中解释说,对于pgfheight("#1")相当于\heightof{#1}来自calc包的 。

\documentclass{article}
\usepackage{tikz}

\newdimen\myLetterHeight

\newlength{\NewLetterHeight}

\tikzset{%
     letterheight/.code={%              
        \pgfmathparse{height("#1")} %From https://tex.stackexchange.com/a/353904/161015
        \setlength{\NewLetterHeight}{\pgfmathresult pt}
        \pgfkeysalso{/tikz/x=\the\NewLetterHeight, /tikz/y=\the\NewLetterHeight, baseline=0pt}%
    },
}
\newcommand*{\TikzScaleToLetterHeight}[2][X]{\begingroup%
    \settoheight{\myLetterHeight}{#1}%
    \pgfkeysalso{/tikz/x=\myLetterHeight, /tikz/y=\myLetterHeight, /tikz/baseline=0pt}%
    #2%
    \endgroup}

\begin{document}
    WITH KEY: \tikz[letterheight=X]
    \draw rectangle (1,1) node[right] {\the\NewLetterHeight};
    
    WITH MACRO: \TikzScaleToLetterHeight[X]{\tikz
        \draw rectangle (1,1) node[right] {\the\myLetterHeight};}
    
    {\Large Large: \TikzScaleToLetterHeight[X]{\tikz
            \draw rectangle (1,1) node[right] {\the\myLetterHeight};}}
\end{document}

最佳解决方案。样式定义可以进一步简化。

\documentclass{article}
\usepackage{tikz}   

\tikzset{
    scale to letter height/.style={
        x={height("#1")}, y={height("#1")}, baseline=0pt
    },
}

\begin{document}
    WITH KEY: \tikz[scale to letter height=X]       
    \draw rectangle (1,1) node[right] {\pgfmathparse{height("X")}\pgfmathresult pt};        
\end{document}

相关内容