![Wie erhalte ich die Höhe einer Figur in LaTeX](https://rvso.com/image/330740/Wie%20erhalte%20ich%20die%20H%C3%B6he%20einer%20Figur%20in%20LaTeX.png)
Ich habe LaTeX-Code
\begin{figure}
ABC
\caption{def}
\end{figure}
Und ich möchte in der Lage sein, seine Höhe in einer pdf
Ausgabe zu finden. Die beschriebene MethodeHierfunktioniert nicht und führt zu folgendem Fehler:
! LaTeX Error: Not in outer par mode.
Ich habe mit dem Gedanken gespielt, \write18
die Größe der Abbildung selbst mithilfe von Pixel-Grabbing-Tricks zu messen. Wenn die Beschriftungsgröße im Dokument jedoch global geändert würde, würde das alles durcheinanderbringen.
Ich habe mich gefragt, ob es eine gültige Möglichkeit gibt, dies zu tun.
Antwort1
Hier ist eine Lösung
\documentclass{article}
\usepackage{capt-of}
\newsavebox\mybox
\begin{document}
\sbox\mybox{\parbox[b]{\textwidth}{ABC\captionof{figure}{bla bla}}}
\the\ht\mybox
\end{document}
Hier ist eine andere Lösung:
\documentclass{article}
\begin{document}
\the\pagetotal
\begin{figure}[h]
ABC
\caption{def}
\end{figure}
\the\pagetotal
\end{document}
Aktualisieren In diesem Beispiel versuchen wir, die Float-Position auf der ersten Seite manuell zu reproduzieren und überlassen die Arbeit auf der zweiten Seite Latex.
Notiz:wie man sehen kann, gibt es für die obere Position kein Problem. Die Reproduktion der unteren Position ist schwierig (wenn nicht unmöglich?)
\documentclass{article}
\usepackage{capt-of}
\usepackage{lipsum}
\newsavebox\mybox
\newcommand\myfigure[1][(Manually)]{\rule{5cm}{1cm}\captionof{figure}{My figure #1}}
\begin{document}
\sbox\mybox{\parbox[b]{\linewidth}{\myfigure
\boxmaxdepth \maxdepth
\vbox{}
\vskip -\floatsep
\topfigrule
\vskip \textfloatsep}}
\noindent\parbox[b]{\linewidth}{\myfigure
\boxmaxdepth \maxdepth
\vbox{}
\vskip -\floatsep
\topfigrule
\vskip \textfloatsep}
\the\ht\mybox****\lipsum[3]
\sbox\mybox{\parbox[b]{\textwidth}{\myfigure}}
\noindent\parbox[b]{\textwidth}{\myfigure}
Height without any vspace:\the\ht\mybox****\lipsum[3-4]
bla bla
this is difficult, see value of the height in next page
\sbox\mybox{\parbox[b]{\linewidth}{\vskip \textfloatsep
\botfigrule
\vbox{}
\vskip -\floatsep
\myfigure}}
\noindent\parbox[b]{\linewidth}{\vskip \textfloatsep
\botfigrule
\vbox{}
\vskip -\floatsep
\myfigure}
\newpage\the\ht\mybox****\lipsum[3]
\begin{figure}[t]
\myfigure[(\LaTeX)]
\end{figure}
\lipsum[3-4]
\begin{figure}[b]
\myfigure[(\LaTeX)]
\end{figure}
\lipsum[3]
\end{document}
Antwort2
Die Zahl wird in einer Box gespeichert, damit Sie sie messen können (bei Floats müssen Sie sich etwas mehr anstrengen, h
da diese möglicherweise vor der Berichterstattung verwendet werden, wenn dies wie hier nach der Umgebung erfolgt).
\documentclass{article}
\begin{document}
\begin{figure}
ABC
\caption{def}
\xdef\thisfloat{\the\csname @currbox\endcsname}%
\end{figure}
\typeout{%
** This float + caption has height + depth:^^J**
\the\dimexpr\ht\thisfloat+\dp\thisfloat\relax}
\end{document}
Erzeugt ein Protokoll von
** This float + caption has height + depth:
** 30.77776pt
oder bis zum Schluss gesammelt:
\documentclass{article}
\begin{document}
\begin{figure}
ABC
\caption{def\label{z}}
\xdef\thisfloat{\the\csname @currbox\endcsname}%
\end{figure}
\edef\tmp{\noexpand\AtEndDocument{%
\noexpand\foo{z}{\the\dimexpr\ht\thisfloat+\dp\thisfloat\relax}}}%
\tmp
aaaa
\begin{figure}
ABC\\
XYZ
\caption{def\label{z2}}
\xdef\thisfloat{\the\csname @currbox\endcsname}%
\end{figure}
\edef\tmp{\noexpand\AtEndDocument{%
\noexpand\foo{z2}{\the\dimexpr\ht\thisfloat+\dp\thisfloat\relax}}}%
\tmp
aaaa
\def\foo#1#2{% whatever you want to do with the data
\typeout{**^^J%
** This float (#1) + caption has height + depth: #2^^J**
}}
\end{document}
**
** This float (z) + caption has height + depth: 30.77776pt
**
**
** This float (z2) + caption has height + depth: 42.77776pt
**