I used to happily create TikZ drawings with pt
units, let’s say in a paper using the IEEE style:
\documentclass{IEEEtran} \usepackage{tikz} \usetikzlibrary{positioning} \begin{document} \begin{tikzpicture} \node[text width=60pt] (mor){Morphological Analysis}; \node[text width=35pt,right=12pt of mor] (syn) {Syntactic Analysis}; \draw[-latex] (mor) -- (syn); \end{tikzpicture} \end{document} |
The output looks good enough, although I did have to try several times getting the text widths right:
But often times I’d want to reuse my TikZ code in other documents, e.g. a Beamer presentation, or my thesis in which I must use Times 11pt. But when I happily copied over my Tikz snippet over, I get:
\documentclass{beamer} ... \begin{tikzpicture} ... \end{tikzpicture} ... |
\documentclass[11pt]{memoir} \usepackage{mathptmx} ... \begin{tikzpicture} ... \end{tikzpicture} ... |
Ouch, it looks like I need to figure out the different text width
values in pt
s by trial and error, for each document I want to include my picture in!
Or do I?
The real issue here is that pt
is an absolute unit (1pt = 1/72 inch), so my TikZ node’s text width stays the same while the font metrics is different in each document. Using relative units, like em
or ex
, would make my life a lot easier.
Let me explain: 1em
is the height of the current typeface in the current size, and is a little bit wider than a capital ‘M’. This means the length/width 1em
depends on the active font family and size.
And as a rough estimate, a capital ‘M’ is twice as long as a lowercase letter. ‘Morphological’ has 1 ‘M’ and 12 lower case letters, but 3 of these are ‘thin’ letters (‘l’ and ‘i’), so I’d go with 6em
rather then 7. Similarly, I’d try 4em
for ‘Syntactic Analysis’.
Let’s see the results, using the same TikZ code in all three versions (IEEE paper, beamer and typical thesis):
\documentclass{IEEEtran} \usepackage{tikz} \usetikzlibrary{positioning} \begin{document} \begin{tikzpicture} \tikzset{every node/.style={draw,align=center}} \node[text width=6em] (mor){Morphological Analysis}; \node[text width=4em,right=1em of mor] (syn) {Syntactic Analysis}; \draw[-latex] (mor) -- (syn); \end{tikzpicture} \end{frame} \end{document} |
\documentclass{beamer} ... \begin{tikzpicture} ... \end{tikzpicture} ... |
\documentclass[11pt]{memoir} \usepackage{mathptmx} ... \begin{tikzpicture} ... \end{tikzpicture} ... |
There! The text widths would vary relative to the current font families and sizes in use, so I won’t have to fiddle around with pt
values for every new document I want to incorporate my existing TikZ code.
nice. unfortunately for me I prefer to use ASCII-based Ditaa or Graphviz DOT language and insert into as graphics.