Wie erhalte ich die Höhe einer Figur in LaTeX

Wie erhalte ich die Höhe einer Figur in LaTeX

Ich habe LaTeX-Code

\begin{figure}
    ABC
    \caption{def}
\end{figure}

Und ich möchte in der Lage sein, seine Höhe in einer pdfAusgabe 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, \write18die 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?) Bildbeschreibung hier eingeben

\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, hda 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
** 

verwandte Informationen