Ich habe **Neue, komplett überarbeite und stark vereinfachte Lösung.**
Bei den Teilen oberhalb und unterhalb der Skala handelt es hinbekommen.
Es funktioniert; doch mit der Bestimmung der relativen Maße bin ich (noch) nicht richtig zufrieden. Im Grunde ist der Teil des 1. Teils, der sich auf vertikale Maße bezieht, hier eigentlich nur Spielerei; da die Lösung später um Annotationen, für die man feste Maße verwenden kann (zumindest was ihre Höhe angeht, die Breite muss sich zur gewählten Breite anpassen). Wichtig ist, dass sich die Skala den gewählten Höhenmaßen anpasst.
___
[![alt text][1]][2]
Im folgenden Code kann man mit den Werten etwas rumspielen
% Eingaben ======================
\pgfmathsetmacro{\HoeheSkala}{6.7}
\pgfmathsetmacro{\Breite}{1.4} % 1.4
\pgfmathtruncatemacro{\TemperaturMin}{-274}
\pgfmathtruncatemacro{\TemperaturMax}{107}
\pgfmathsetmacro{\unterteilungstiefe}{5} % kleine Skala (minor ticks)
\pgfmathsetmacro{\Unterteilungstiefe}{20}% große Skala (major ticks)
% ============================
und dann
\thermo{22}
um die Skalen wieder absolute für `22°C` anzuzeigen.
Insb. wenn die Kelvin-Skala verwendet wird muss ein geeigneter Temperaturbereich gewählt werden. Die automatische Anpassung von `Tmax` (bzw. `Tmin`), falls kein geeigneter Bereich gewählt wurde, könnte man jetzt noch mit diversen if-Abfragen eintsellen; ist mir aber gerade zu mühsam.
Mit entsprechendem Auskommentieren kann man auch nur zwei oder nur ein Thermometer anzeigen, z.B.
[![alt text][3]][3]
%\documentclass[]{article}
\documentclass[margin=5pt, tikz]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc, math}
\usepackage{amssymb, mwe}
\begin{document}
% Eingaben ======================
\pgfmathsetmacro{\HoeheSkala}{6.7}
\pgfmathsetmacro{\Breite}{1.4} % 1.4
\pgfmathtruncatemacro{\TemperaturMin}{-274}
\pgfmathtruncatemacro{\TemperaturMax}{107}
\pgfmathsetmacro{\unterteilungstiefe}{5} % kleine Skala (minor ticks)
\pgfmathsetmacro{\Unterteilungstiefe}{20}% große Skala (major ticks)
% ============================
% Temperaturfunktionen
\tikzmath{
function TemperaturStand(\t) {return (\t+abs(\Tmin))*\skalenteilung;};
function Fahrenheit(\t) {return \t*1.8+32;};
function Kelvin(\t) {return \t+273.15;};
}
% Zeichenebenen
\pgfdeclarelayer{foreground layer}
\pgfsetlayers{main,foreground layer}
\newcommand\Skala[1]{%%%%%%%%%%%%%%%%%
\def\Skalentyp{#1}
\if\Skalentyp C % Celsius =====================
\pgfmathtruncatemacro{\Tmin}{\TemperaturMin}
\pgfmathtruncatemacro{\Tmax}{\TemperaturMax}
\def\Titel{$^\circ$#1}
\else % Kelvin ===========================
\if\Skalentyp K
\pgfmathtruncatemacro{\Tmin}{Kelvin(\TemperaturMin)}
\pgfmathtruncatemacro{\Tmax}{Kelvin(\TemperaturMax)}
\def\Titel{#1}
\else % Fahrenheit =========================
\pgfmathtruncatemacro{\Tmin}{Fahrenheit(\TemperaturMin)}
\pgfmathtruncatemacro{\Tmax}{Fahrenheit(\TemperaturMax)}
\def\Titel{$^\circ$#1}
\fi
\fi
%
\pgfmathsetmacro{\skalenweite}{\Tmax-\Tmin}
\pgfmathsetmacro{\skalenteilung}{\HoeheSkala/\skalenweite}
}%%%%%%%%%%%%%%%%%
% Allgemein
\pgfmathsetmacro{\Null}{0.0} % als Vergleichsoperator
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcommand{\Thermometer}[1]{%%%%%%%%%%%%%%%
% Vertikale Maße
\coordinate[] (H) at (0,\HoeheSkala);
% Horizontale Maße verwendet. Vll. bekomme ich das noch besser hin.
[![alt text][1]][1]
%\documentclass[]{article}
\documentclass[margin=5pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{amssymb}
\begin{document}
% ==================================
\newcommand\Thermometer[1]{%===============
\def\Skalentyp{#1}
% Maße festlegen
\pgfmathsetmacro{\Breite}{1.4} % 1.4
\pgfmathsetmacro{\Xa}{0}
\pgfmathsetmacro{\a}{0} % 0
\pgfmathsetmacro{\Xb}{\Breite*1/7} \pgfmathsetmacro{\b}{\Breite*1/7} % 0.2
\pgfmathsetmacro{\Xc}{\Breite*2/7} \pgfmathsetmacro{\c}{\Breite*2/7} % 0.4
\pgfmathsetmacro{\Xd}{\Breite*3/7} \pgfmathsetmacro{\d}{\Breite*3/7} % 0.6
\pgfmathsetmacro{\Xe}{\Breite*4/7} \pgfmathsetmacro{\e}{\Breite*4/7} % 0.8
\pgfmathsetmacro{\Xf}{\Breite*5/7} \pgfmathsetmacro{\f}{\Breite*5/7} % 1.0
\pgfmathsetmacro{\Xg}{\Breite*6/7} \pgfmathsetmacro{\g}{\Breite*6/7} % 1.2
\pgfmathsetmacro{\Xh}{\Breite} \pgfmathsetmacro{\h}{\Breite} % 1.4
%
\coordinate[] (a) at (\Xa,0);
(\a,0);
\coordinate[] (b) at (\Xb,0);
(\b,0);
\coordinate[] (c) at (\Xc,0);
(\c,0);
\coordinate[] (d) at (\Xd,0);
(\d,0);
\coordinate[] (e) at (\Xe,0);
(\e,0);
\coordinate[] (f) at (\Xf,0);
(\f,0);
\coordinate[] (g) at (\Xg,0);
(\g,0);
\coordinate[] (h) at (\Xh,0);
% Rounded Corners
\pgfmathsetmacro{\RCI}{13*\Breite} % 6mm
\pgfmathsetmacro{\RCII}{10*\Breite} % 5mm
\pgfmathsetmacro{\RCIII}{2*\Breite} % 1mm
\pgfmathsetmacro{\RCIV}{6*\Breite} % 3mm
\pgfmathsetmacro{\Hoehe}{12.5} % 12.5
\pgfmathsetmacro{\HoeheTank}{-\Hoehe*12/25}
\pgfmathsetmacro{\yA}{\HoeheTank}
\pgfmathsetmacro{\yB}{\HoeheTank*2/3}
\pgfmathsetmacro{\yC}{\HoeheTank*1/2}
\pgfmathsetmacro{\yD}{\HoeheTank*5/12} %(\yA+\yB)/4
\pgfmathsetmacro{\yE}{\HoeheTank*1/3}
\pgfmathsetmacro{\yDE}{0.5*(\yE+\yD)}
\pgfmathsetmacro{\yF}{\Hoehe*9/10}
\pgfmathsetmacro{\yG}{\Hoehe}
% Shifts
\pgfmathsetmacro{\S}{(\yG+\yF)/2} % 5mm
%\def\yA{-6}
%\def\yB{-4}
%\def\yC{-3}
%\def\yD{-2.5} % -2.5
%\def\yDE{-2.25}
%\def\yE{-2}
%\def\yF{11}
%\def\yG{12.5}
\pgfmathtruncatemacro{\Tmin}{-30}
\pgfmathtruncatemacro{\TminII}{\Tmin+2}
\pgfmathtruncatemacro{\TminX}{\Tmin+10}
\pgfmathsetmacro{\Tmax}{104}
%\pgfmathsetmacro{\SkalenHoehe}{\yF-\yE}
%\pgfmathsetmacro{\SkalenTeile}{\SkalenHoehe/(\Tmax-\Tmin)}
%\pgfmathsetmacro{\SkalenFaktor}{\SkalenHoehe/\SkalenTeile}
\pgfmathsetmacro{\TminF}{\Tmin*1.8+32}
\pgfmathsetmacro{\TminFII}{\TminII*1.8+32}
\pgfmathsetmacro{\TminFX}{\TminX*1.8+32}
(\h,0);
%\begingroup
\Skala{#1}
\foreach[
evaluate={\T = (\t+abs(\Tmin))*\skalenteilung},
evaluate={\u = mod(\t,\unterteilungstiefe)},
evaluate={\U = mod(\t,\Unterteilungstiefe)},
] \t in {\Tmin,...,\Tmax}{
\ifx\U\Null
\draw([shift={(0,\T)}]a) -- ([shift={(0,\T)}]d); % große Skala
\node[shift={(\f,\T)}]{\t}; % Zahlen
\else
\ifx\u\Null
\draw ([shift={(0,\T)}]a) -- ([shift={(0,\T)}]c) node[right]{};%\t % kleine Skala
\else
\fi
\fi
}
%
%\endgroup
% Annotationen %%%%%%%%%%%%%%%%%%
% Thermometerkörper der Skala zeichnen
\foreach \x in {a,d,e,h}
\draw[] (\x) -- ($(\x)+(H)$);
% Unteren Thermometerkörper zeichnen
\coordinate[] (A) at (0,\yA);
(0,-0.3);
\coordinate[] (B) at (0,\yB);
(0,-0.6);
\coordinate[] (C) at (0,\yC);
(0,-1);
\coordinate[] (D) at (0,\yD);
\coordinate[] (DE) at (0,\yD);
(0,-1.2);
\coordinate[] (E) at (0,\yE);
(0,-1.5);
\coordinate[] (F) at (0,\yF);
(0,-2.5);
\coordinate[] (G) at (0,\yG);
(0,-2.7);
\pgfmathsetmacro{\m}{0.5*\Breite}
\coordinate[] (m) at (\m,0);
\draw[rounded corners=\Breite] (a) -- ($(A) + (a)$) -- ($(B) + (c)$) -- ($(C) + (c)$) -- ($(D) + (b)$) -- ($(E) + (b)$);;
\draw[rounded corners=\Breite] ($(E) + (g)$) -- ($(D) + (g)$) -- ($(C) + (f)$) -- ($(B) + (f)$) -- ($(A) + (h)$) -- (h);
% Bogen
\draw[rounded corners=10*\Breite] ($(E) + (b)$) -- ($(G) + (b)$) -- ($(G) + (g)$) -- ($(E) + (g)$);
% Quecksilbertank
\fill[rounded corners=6*\Breite] ($(F) + (c)$) rectangle ($(C) + (f)$);
\filldraw[] ($(D) + (d)$) rectangle (e);
% Oberen Thermometerkörper zeichnen
\coordinate[] (P) at (0,\HoeheSkala+0.8);
\coordinate[] (Q) at (0,\HoeheSkala+0.4);
\draw[rounded corners=14*\Breite] (H) -- (P) -- ($(P)+(h)$) -- ($(H)+(h)$);
\draw[rounded corners=2*\Breite] ($(H)+(d)$) -- ($(Q)+(d)$) -- ($(Q)+(e)$) -- ($(H)+(e)$);
%%%%%%%%%%%%%%%%%%
% Titel
\node at ($(Q)+(f)$) {\Titel};
}%%%%%%%%%%%%%%%%%
% Anzuzeigende Werte
\newcommand*\WertAnzeigen[2]{%%%%%%%%%%%%%%%%%
\tikzset{/pgf/number format/.cd,fixed zerofill,precision=1, assume math mode=true}
%
\if\Skalentyp C % Celsius ====================
\pgfmathsetmacro{\Wert}{\temperatur+0}
%\pgfmathsetmacro{\wert}{TemperaturStand(\Wert)}
\path[]([shift={(0,#1)}]$(a)-(c)$) node[name=#2]{}
--
([shift={(0,#1)}]$(h)+(b)$);
\begin{pgfonlayer}{foreground layer}
\node[anchor=west, inner xsep=1pt, fill=white] at ([shift={(0,#1)}]$(h)+(b)$) {\pgfmathprintnumber\Wert};
\end{pgfonlayer}
%
\else
\if\Skalentyp K % Kelvin ====================
\pgfmathsetmacro{\Wert}{Kelvin(\temperatur)}
\path[]([shift={(0,#1)}]a)
--
([shift={(0,#1)}]$(h)+(b)$) node[anchor=west, fill=white, name=#2]{\pgfmathprintnumber\Wert};
%
\else % Fahrenheit ====================
\pgfmathsetmacro{\Wert}{Fahrenheit(\temperatur)}
\path[]([shift={(0,#1)}]a)
--
([shift={(0,#1)}]$(h)+(b)$) node[anchor=west, fill=white, name=#2]{\pgfmathprintnumber\Wert};
\fi
\fi
}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcommand{\thermo}[1]{%%%%%%%%%%%%%%%%
\noindent\begin{tikzpicture}[
%x=0.2cm, %y = 1cm,
%xscale=0.5, %yscale=0.75,
nodes={align=center, font=\sffamily\tiny, inner sep=0pt}
]
\begin{scope}[name=Celsius]
\Thermometer{C}
% Festanzuzeigende Werte
\foreach[count=\i] \t/\text in {%
-273.15/Absoluter\\ Temperatur-\\nullpunkt,%
0/Gefrierpunkt\\ von Wasser,%
37/K{\"o}rper-\\temperatur,%
100/Siedepunkt\\ von Wasser,%
}{
\pgfmathsetmacro{\temperatur}{\t}
\WertAnzeigen{TemperaturStand(\t)}{p\i}
\node[anchor=east] at (p\i) {\text};
}
% Variabler Wert
\pgfmathsetmacro{\temperatur}{#1}
\pgfmathsetmacro{\Stand}{TemperaturStand(\temperatur)}
\WertAnzeigen{TemperaturStand(\temperatur)}{p}
\filldraw []($(0,\Stand)+(e)$) rectangle (d);
\end{scope}
\begin{scope}[name=Fahrenheit, right of =Celsius, xshift = 2cm]
\Thermometer{F}
% Festanzuzeigende Werte
\foreach[count=\i] \t in {-273.15,0,37,100}{%%
\pgfmathsetmacro{\temperatur}{\t}
\WertAnzeigen{TemperaturStand(Fahrenheit(\t))}{q\i}
}%%
% Variabler Wert
\pgfmathsetmacro{\temperatur}{#1}
\WertAnzeigen{TemperaturStand(Fahrenheit(\temperatur))}{q}
\pgfmathsetmacro{\Stand}{TemperaturStand(Fahrenheit(\temperatur))}
\filldraw []($(0,\Stand)+(e)$) rectangle (d);
\end{scope}
\begin{scope}[name=Kelvin, right of =Fahrenheit, xshift = 5cm]
\Thermometer{K}
% Festanzuzeigende Werte
\foreach[count=\i] \t in {-273.15,0,37,100}{%%
\pgfmathsetmacro{\temperatur}{\t}
\WertAnzeigen{TemperaturStand(Kelvin(\t))}{r\i}
}%%
% Variabler Wert
\pgfmathsetmacro{\temperatur}{#1}
\WertAnzeigen{TemperaturStand(Kelvin(\temperatur))}{r}
\pgfmathsetmacro{\Stand}{TemperaturStand(Kelvin(\temperatur))}
\filldraw []($(0,\Stand)+(e)$) rectangle (d);
\end{scope}
% Verbindungslinien
% Festanzuzeigende Werte
\foreach \i in {1,...,4}
\draw[very thin] (p\i) -- (q\i) -- (r\i);
% Variabler Wert
\draw[thick] (p) -- (q) -- (r);
% Koordinaten anzeigen
%\foreach \x in {a,b,...,h}
{a,...,h}
%\fill[red] (\x) circle (1pt) node[below]{\x};
%
%%
%\foreach \y in {A,B,...,G, DE}
{A,...,G,P,Q}
%\fill[red] (\y) circle (1pt) node[left]{\y};
% Thermometerkörper
% Skalenkörper
\draw[rounded corners=\RCI] (E) -- (G) -- ($(G)+(h)$) -- ($(E)+(h)$);
% Quecksilbertank
%links
\draw[rounded corners] (E) -- ($(DE)+(c)$) -- ($(C) + (b)$) -- ($(B) + (b)$);
% rechts
\draw[rounded corners] ($(E)+(h)$) -- ($(D)+(f)$) -- ($(C) + (g)$) -- ($(B) + (g)$);
\draw[rounded corners=\RCII] ($(B) + (b)$) -- ($(A) + (b)$) -- ($(A)+(g)$) -- ($(B)+(g)$);
% oben
\draw[rounded corners=\RCIII] ([yshift=-\S]$(E)+(d)$) rectangle ([yshift=-\S]$(G) + (e)$);
% Füllung Quecksilbertank
\filldraw[shift={(0,-0.2)}, rounded corners=\RCIV] ($(A)+(c)$) rectangle ($(C) + (f)$);
\filldraw[] ($(C)+(d)$) rectangle ($(E) + (e)$);
% Titel
\node[] node[below]{\y};
%%
%\draw[red, |<->|] (2,0) -- (2,\HoeheSkala) node[midway, above=1mm, sloped]{\HoeheSkala};
%\node[font=\normalsize] at ([xshift=0.125*\S, yshift=-1.25*\S]$(G)+(f)$) {$^{\circ}$\Skalentyp};
0
% Berechnung der Füllung der Skala
\if\Skalentyp C% Celsius ====================
% Einheiten für Füllung Quecksilbertank oben
\pgfmathsetmacro{\tAnzeige}{\temperatur}
\pgfmathsetmacro{\tStand}{\temperatur+abs(\Tmin)}
\pgfmathsetmacro{\Null}{0}
\pgfmathsetmacro{\Koch}{100}
\def\Eis{Gefrier-\\punkt}
\def\Dampf{Siede-\\punkt}
% Skala links 1
\foreach[evaluate={\T=(\t+abs(\Tmin))*1}] \t in {\Tmin,\TminII,...,\Tmax}{
\ifx\t\Null
% Feste Annotationen
\draw[] ([yshift=\T mm]$(E)+(b)$) -- ([yshift=\T mm, xshift=-\S]$(E)+(a)$) node[anchor=east, inner sep=1pt,name=pE] {\t};
\node[left of=pE]{\Eis};
\else
\ifx\t\Koch
\draw[] ([yshift=\T mm]$(E)+(b)$) -- ([yshift=\T mm, xshift=-\S]$(E)+(a)$) node[anchor=east, inner sep=1pt,name=pD]{\t};
\node[left of=pD]{\Dampf};
\else
% Schleifenannotationen
\draw[] ([yshift=\T mm]E) -- ([yshift=\T mm]$(E)+(c)$);
\fi
\fi}
%
\foreach[evaluate={\T=int(\t+abs(\Tmin))}] \t in {\Tmin,\TminX,...,\Tmax}{%%
% Skala links 2
\draw[] ([yshift=\T mm]E) -- ([yshift=\T mm]$(E)+(d)$);
% Skala rechts
\node[font=\sffamily\scriptsize] at ([xshift=2pt,yshift=\T mm]$(E)+(f)$) {\t};
}%%
%
\else% Fahrenheit ====================
% Einheiten für Füllung Quecksilbertank oben
\pgfmathsetmacro{\SkalenFaktor}{130/234}%234 Skaleneinheiten auf 130mm
\pgfmathsetmacro{\tAnzeige}{(32+\temperatur*9/5 }
\pgfmathsetmacro{\tStand}{(\tAnzeige+22)*\SkalenFaktor}
\pgfmathsetmacro{\Null}{32}
\pgfmathsetmacro{\Koch}{212}
\def\Wasser{von \\ Wasser}
% Skala links 1
\foreach[evaluate={\T=(\t+22)*\SkalenFaktor}] \t in {-22,-20,...,222}{
\ifx\t\Null
% Feste Annotationen
\draw[] ([yshift=\T mm]E) -- ([yshift=\T mm]$(E)+(c)$);
\draw[] ([yshift=\T mm]$(E)+(e)$) -- ([yshift=\T mm, xshift=\S]$(E)+(h)$) node[anchor=west, inner sep=1pt, name=qE]{\t};
\node[right of=qE]{\Wasser};
\else
\ifx\t\Koch
\draw[] ([yshift=0 mm]E) -- ([yshift=0 mm]$(E)+(c)$);
\draw[] ([yshift=\T mm]$(E)+(e)$) -- ([yshift=\T mm, xshift=\S]$(E)+(h)$) node[anchor=west, inner sep=1pt,name=qD] {\t};
\node[right of=qD]{\Wasser};
\else
% Schleifenannotationen
\draw[] ([yshift=\T mm]E) -- ([yshift=\T mm]$(E)+(c)$);
\fi
\fi}
%
\foreach[evaluate={\T=(\t+22)*\SkalenFaktor}] \t in {-20,-10,...,220}{%%
% Skala links 2
\draw[] ([yshift=\T mm]E) -- ([yshift=\T mm]$(E)+(d)$);
% Skala rechts
\node[font=\sffamily\scriptsize] at ([xshift=2pt,yshift=\T mm]$(E)+(f)$) {\t};
}%%
%
\fi%====================
%
% Füllung Quecksilbertank oben
\filldraw[] ($(E)+(d)$) rectangle ([yshift=\tStand mm]$(E) + (e)$);
%
% Anzeige der gewählten Temperatur
\def\tAnzeigeWert{\pgfmathprintnumber[fixed zerofill,precision=1, assume math mode=true]\tAnzeige}
%
\if\Skalentyp C% Celsius ====================
\draw[thick] ([yshift=\tStand mm]$(E) + (e)$) -- ([yshift=\tStand mm, xshift=-\S]$(E) + (a)$) node[anchor=east, inner sep=1pt, name=p]{\tAnzeigeWert};
%
\else% Fahrenheit ====================
\draw[thick] ([yshift=\tStand mm]$(E) + (d)$) -- ([yshift=\tStand mm, xshift=\S]$(E) + (h)$) node[anchor=west, inner sep=1pt, name=q]{\tAnzeigeWert};
%
\fi%====================
}%==================================
% ==================================
\newcommand{\thermo}[1]{%%%%%%%%%%%%
\noindent\begin{tikzpicture}[
%x=0.2cm,
xscale=0.9,
yscale=0.75,
nodes={align=center, font=\sffamily\scriptsize}
]
\def\temperatur{#1}
\begin{scope}[name=Celsius]
\Thermometer{C}
\end{scope}
%
\begin{scope}[right of =Celsius, xshift=3cm]
\Thermometer{F}
\end{scope}
% Verbindungslinien
\draw[densely dashed, thin] (pE) -- (qE);
\draw[densely dashed, thin] (pD) -- (qD);
\draw[densely dashed, thick] (p) -- (q);
(3,-3){\pgfmathparse{Fahrenheit(90)}\pgfmathresult};
\end{tikzpicture}
}%%%%%%%%%%%%
\thermo{22}
%\thermo{-15}
}%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\thermo{66}
\thermo{-15}
\thermo{100}
%\lipsum[66]
\end{document}
[1]: https://texwelt.de/wissen/upfiles/55555555_152.pnghttps://texwelt.de/wissen/upfiles/55555555_155.png
[2]: https://texwelt.de/wissen/upfiles/55555555_155.png
[3]: https://texwelt.de/wissen/upfiles/55555555_156.png