
Gibt es eine Möglichkeit, die Höhe eines Knotens in einem Tikz-Bild zu berechnen und eine Länge durch eine andere Länge zu teilen, um einen Zähler zu erhalten und diesen aufzurunden? Wenn ja, wo kann ich nach dem Thema „Berechnen mit verschiedenen Variablentypen“ nachlesen?
Hier ist ein Beispiel:
\documentclass [a4paper] {article}
\usepackage{calc}
\usepackage{tikz,pgf}
\usetikzlibary{arrows}
%in this case i want to do a framebox with the parameter of 1 line's length in a tikz pictures
%because i dont know how could i get the heigth of the node i try to calculate it by divide the full length of the text (what i got with the command \settototalheight from the calc package) by the length of 1 line (this is a parameter) so i got the number of lines(this is a value not a length so i cannot use the \divide command because the type of the variable)
\newlength \widthofone \fullwidth \heightoneline \fullheight
\nemcounters \numberoflines
\newcommand {\altframe}[2] { %#1 the text #2 the width of the lines
\widthofone=#2pt %im not sure how to convert a length from a value but i try to input the 2nd parameter into a length variable
\settototalheight{\heightoneline}{qwe} %i get the height of one line by the calc package
\setwidth{\totalwidth}{#1} %i calculate the width of the text
%And now i would divide \fullwidth by \widthofone ,if i would know how to do it, to get \numberoflines
%I would multiply it by \height to get \fullheight
\begin{tikzpictures}
\node[text width=#2pt] at (0,0) {#1};%i write out the text
\draw[->,color=black] (\fullwidth/2,\fullheight/2) -- (0-\fullwidth/2,\fullheight/2); %i draw out the lines (i use height/2 becouse of the fact that the (0,0) coordinate is the middle of the picture)
\draw[->,color=black] (\fullwidth/2,0-\fullheight/2) -- (0-\fullwidth/2,0-\fullheight/2);
\draw[->,color=black] (\fullwidth/2,\fullheight/2) -- (\fullwidth/2,0-\fullheight/2);
\draw[->,color=black] (0-\fullwidth/2,\fullheight/2) -- (0-\fullwidth/2,0-\fullheight/2);
\end{tikzpictures}
}
\begin{document}
\altframe{i love this sample text}{100}
\end{document}
Antwort1
Ich kann nicht herausfinden, was Sie tun werden. Aber zu Ihren Unterfragen:
Berechnen Sie die Höhe eines Knotens in einem Tikz-Bild
Ähnlich zu\widthof innerhalb von tikzpicture
\makeatletter
\newcommand\getheightofnode[2]{%
\pgfextracty{#1}{\pgfpointanchor{#2}{north}}%
\pgfextracty{\pgf@ya}{\pgfpointanchor{#2}{south}}%
\addtolength{#1}{-\pgf@ya}}
\makeatother
eine Länge durch eine andere Länge teilen
Sie können \usetikzlibrary{math}
, und schreiben Sie einfach
\tikzmath{
\numberoflines=\fullwidth/\widthofone;}
und runde es auf
\tikzmath{
\numberoflines=ceil(\fullwidth/\widthofone);}
Jedoch, Bitte beachte das
- die Anzahl der Zeilen kann so nicht berechnet werden. Da TeX dazu neigt, Zeilen anentsprechende Positionen, die Zeilenanzahl ist meist größer.
- „Die (Gesamt-)Höhe einer Linie“ ist keine Konstante. Beispielsweise haben
{x xx}
,{M MM}
, und{j jj}
unterschiedliche Höhen. - Und noch schlimmer: „Die (Gesamt-)Höhe einer Liniein einem Absatz' unterscheidet sich von dem, was
\settototalheight
Sie erhalten. Normalerweise ist ersteres\baselineskip
, kann aber auch größer sein.
Ich vermute also, dass der folgende Code Ihrem Ansatz näher kommt.
\documentclass{article}
\usepackage{calc,tikz}\usetikzlibrary{math}
\newlength\widthofone \newlength\fullwidth \newlength\heightoneline \newlength\fullheight
\makeatletter
\newcommand\getheightofnode[2]{%
\pgfextracty{#1}{\pgfpointanchor{#2}{north}}%
\pgfextracty{\pgf@ya}{\pgfpointanchor{#2}{south}}%
\addtolength{#1}{-\pgf@ya}}
\makeatother
\newcommand {\altframe}[2]{
\widthofone=#2
\heightoneline\baselineskip
\settowidth{\fullwidth}{#1}
\begin{tikzpicture}[->,color=black]
\node[text width=#2](baby)at(0,0){#1};
\getheightofnode\fullheight{baby}
\tikzmath{
\numberoflines=round(\fullheight/\heightoneline);}
\draw(\fullwidth/2,\fullheight/2)--(-\fullwidth/2,\fullheight/2);
\draw(\fullwidth/2,-\fullheight/2)--(-\fullwidth/2,-\fullheight/2);
\draw(\fullwidth/2,\fullheight/2)--(\fullwidth/2,-\fullheight/2);
\draw(-\fullwidth/2,\fullheight/2)--(-\fullwidth/2,-\fullheight/2);
\node[text width=5cm]at(0,-3){
widthofone =\the\widthofone \\
fullwidth =\the\fullwidth \\
heightoneline =\the\heightoneline \\
fullheight =\the\fullheight \\
numberoflines = \numberoflines};
\end{tikzpicture}}
\begin{document}
\altframe{i love this sample text}{50pt}
\end{document}