我正在尝试构建一个图表(实际上是一个徽标),我可以通过一个参数轻松缩放它。我希望能够通过一个参数缩放绘图和字体。
这是我当前的 MWE,希望它能够说明我的困难:
\documentclass{standalone}
\usepackage{tikz}
\usepackage{fontspec}
\begin{document}
\begin{tikzpicture}[scale=1.0]
\node [draw=black] at (0,0)
{\fontspec[Scale=2.0]{Bookman Old Style Bold}B};
\node [draw=none] at (0,-0.5)
{\fontspec[Scale=1.0]{Bookman Old Style} This is a B};
\end{tikzpicture}
~
\begin{tikzpicture}[scale=2.0]
\node [draw=black] at (0,0)
{\fontspec[Scale=4.0]{Bookman Old Style Bold}B};
\node [draw=none] at (0,-0.5)
{\fontspec[Scale=2.0]{Bookman Old Style} This is a B};
\end{tikzpicture}
\end{document}
这给了我这个:
我有两个问题:
如何从单个参数得出比例=1/2/4s?
为什么框和“is”中的“i”上的点之间的空间成比例地减少。
更新:
感谢大家迄今为止的回答和评论。
共识方法似乎是“改变一切”,我对此很满意,尽管在我看来,这(在某种程度上)是次优解决方案。为什么?
嗯,据我所知,字体缩放并不是严格按照线性方式逐点缩放的。换句话说,我认为 10pt 字体缩放 2 倍后不是与20pt的相同字体相同。
除此之外,全局缩放也会缩放线条粗细;这很可能会限制我可以放大或缩小的程度。
显然,我假设 fontspec scale= 可以正确“放大字体”。否则,我的代码就和其他人的代码一样“次等”。
我会将事情搁置一段时间,然后接受并对答案进行投票。
顺便说一句,对于那些没有安装字体系列的人来说,这不是问题的重要部分。“任何字体都可以,除了 Comic Sans”。
答案1
要将所有内容一起缩放,您可能需要将所有内容包装在\scalebox{<factor>}{...}
(graphic/x
包中,已由 加载tikz
)。scale
的选项tikz
工作方式不同:它仅缩放坐标。inner sep
确定边框的值不会被它缩放,这会导致i
远离边框。如果不使用 ,您还需要使用比例因子调整此值\scalebox
。
或者,您可以尝试使用相对于字体大小的绘图单位,以 或 为单位ex
。em
您目前使用的默认值是cm
。更好的方法是使用锚点进行定位,即尝试以下方法:
\documentclass{standalone}
\usepackage{tikz}
\usepackage{fontspec}
\begin{document}
\begin{tikzpicture}[scale=1.0,inner sep=4pt]
\node [draw=black] (B)
{\fontspec[Scale=2.0]{Bookman Old Style Bold}B};
\node [draw=none,anchor=north] at (B.south)
{\fontspec[Scale=1.0]{Bookman Old Style} This is a B};
\end{tikzpicture}
~
\begin{tikzpicture}[scale=2.0,inner sep=8pt]
\node [draw=black] (B)
{\fontspec[Scale=4.0]{Bookman Old Style Bold}B};
\node [draw=none,anchor=north] at (B.south)
{\fontspec[Scale=2.0]{Bookman Old Style} This is a B};
\end{tikzpicture}
\end{document}
由于缺少字体,我无法自行编译。
答案2
您可以使用transform canvas
Tikz 中的转换。它可以转换所有内容。例如:
\documentclass{minimal}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[]
\begin{scope}[]
\node [draw=black] at (0,0) {\textbf{B}};
\node [draw=none] at (0,-0.5) {This is a B};
\end{scope}
\begin{scope}[shift={(2,0)},transform canvas={scale=2.0}]
\node [draw=black] at (0,0) {\textbf{B}};
\node [draw=none] at (0,-0.5) {This is a B};
\end{scope}
\begin{scope}[shift={(8,0)},transform canvas={yscale=4.0}]
\node [draw=black] at (0,0) {\textbf{B}};
\node [draw=none] at (0,-0.5) {This is a B};
\end{scope}
\end{tikzpicture}
\end{document}
输出为
答案3
我可能遗漏了上面更复杂的答案的一些内容(因为我无法编译代码),但节点(及其内容)将忽略外部转换,除非您在节点或封闭范围上使用“转换形状”选项。请参阅手册第 16.7 节。一旦您这样做,外部缩放将适用于节点和文本。