10

I need a way to get the current fontsize as a length.

I hope I didn't overlook anything that already provides this. What I found that I can do

\makeatletter
\newlength{\fsize}
\setlength{\fsize}{\f@size pt}
\makeatother

but it will be set to a fixed length that does not update when font size changes.

Now I tried to put it into a command:

\makeatletter
\newlength{\fsizeb}
\setlength{\fsizeb}{\f@size pt}
\newcommand\fsize{\fizeb}
\makeatother

(still works as a length but also does not update - not sure if this is actually valid, maybe this is my first fault)

And finally I tried

\makeatletter
\newlength{\fsizeb}
\newcommand\fsize{%
    \setlength{\fsizeb}{\f@size pt}%
    \fsizeb%
}

which fails and does not seem to return a length.

I assume I'm doing something horribly wrong (I'm quite new to this part of LaTeX, so I hope you can tell me wether what I want is at all possible and give me some pointers how to implement...)


As for why I (think to) need this: I want to be able to set \baselineskip to a specific multiple of the font size (similarly as the line-height property works in CSS/SVG) like so (with the solution suggested by Manuel in the comments):

\documentclass{scrartcl}

\makeatletter
\newcommand*\fsize{\dimexpr\f@size pt\relax}
\makeatother

\begin{document}

\setlength{\baselineskip}{1\fsize}
\verb=\setlength{\baselineskip}{1\fsize}= -- line-height: 1; bars touching exactly\\\textbar\\\textbar

\setlength{\baselineskip}{1.25\fsize}
\verb=\setlength{\baselineskip}{1.25\fsize}= -- line-height: 1.25; (relative to font-size)\\\textbar\\\textbar

\end{document}

If there are yet easier solutions I'd be happy to hear.

  • 3
    why can you not use \f@size as it is, why do you need to use a dimen register? (if you use a register you are going to have to patch \selectfont to update the register every time anything changes but it is hard to think why you would need this) – David Carlisle Jan 11 '18 at 18:55
  • 1
    I would use just \makeatletter\newcommand\fsize{\f@size pt}\makeatother – David Carlisle Jan 11 '18 at 19:54
  • 3
    @DavidCarlisle Or if he actually needs a “length” may be \newcommand*\fsize{\dimexpr\f@size pt\relax}? Although I don't know what could be the case. – Manuel Jan 11 '18 at 19:55
  • @Manuel This was exactly what I was looking for, thank you (feel free to add it as an answer)! I added an explanation on what I want to do with it and why I want to have the result as a length. – Patrick Storz Jan 12 '18 at 1:38
8
\makeatletter
\newcommand*\fsize{\dimexpr\f@size pt\relax}
\makeatother

This way you can use the macro like \setlength{\baselineskip}{1.33\fsize}.

  • My favourite answer. – AlexG Jan 12 '18 at 9:02
9

\selectfont is the switch the changes the font. You can tie into this and update \fsize:

enter image description here

\documentclass{article}

\usepackage{letltxmacro}

\newlength{\fsize}
% https://tex.stackexchange.com/q/88001/5764
\LetLtxMacro\oldselectfont\selectfont
\makeatletter
\DeclareRobustCommand{\selectfont}{\oldselectfont\setlength{\fsize}{\f@size pt}}
\makeatother

\begin{document}

\tiny\the\fsize

\scriptsize\the\fsize

\footnotesize\the\fsize

\small\the\fsize

\normalsize\the\fsize

\large\the\fsize

\Large\the\fsize

\LARGE\the\fsize

\Huge\the\fsize

\end{document}
  • 1
    Confirmed working. The solution posted by Manuel in the comments is a lot more concise, though. – Patrick Storz Jan 12 '18 at 1:39
8

If you set the length, it won't change until you reset it. What you need is a macro:

\makeatletter
\newcommand{\currentfsize}{\f@size pt}
\makeatother

Example (using the code by Werner):

\documentclass{article}

\makeatletter
\newcommand{\currentfsize}{\f@size pt}
\makeatother

\newdimen\fsize
\newcommand{\setfsize}{\setlength{\fsize}{\currentfsize}}

\begin{document}

\setfsize % should be 10pt

\tiny\currentfsize

\scriptsize\currentfsize

\footnotesize\currentfsize

\small\currentfsize

\normalsize\currentfsize

\large\currentfsize

\Large\currentfsize

\LARGE\currentfsize

\Huge\currentfsize

\the\fsize % should be 10pt (printed in \Huge size)

\end{document}

As you see, setting \fsize at the beginning doesn't change its value.

enter image description here

  • This does not give a length - as I want to be able to write e.g. 1.25\fsize that does not completely solve my problem. – Patrick Storz Jan 12 '18 at 1:41
  • 1
    1.25\dimexpr\currentfsize\relax – egreg Jan 12 '18 at 9:12

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.