Die Frage ist zum Archivieren gedacht, kein Support benötigt. Antworten sind jedoch gern gesehen und sehr willkommen! Ich beantworte die Frage auch selbst.


Bei wikipedia findet man:

alt text

Das wollte ich mit TikZ umsetzen, und zwar so, dass

  • man per Kommando eine Anzeigetemperatur auswählen kann, die dann automatisch in beiden Thermometern (Celsius und Fahrenheit) angezeigt wird.
  • alle Bildmaße aus einfachen Angaben wie defHoehe{6.7cm} bzw. defBreite{1.4cm} entstehen

Zum 2. Punkt:

alt text

Das markierte Bild hat eine Gesamthöhe von ca. 7cm und ist gut lesbar.

gefragt 17 Apr '18, 20:56

cis's gravatar image

cis
9.5k75452491
Akzeptiert-Rate: 29%

bearbeitet 17 Apr '18, 21:05


Neue, komplett überarbeite und stark vereinfachte Lösung.

Bei den Teilen oberhalb und unterhalb der Skala handelt es sich eigentlich nur 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


alt text

Im folgenden Code kann man mit den Werten etwas rumspielen

Öffne in Overleaf
% 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)
% ============================
% Feste Werte anzeigen
\def\List{%
%-273.15/Absoluter\\ Temperatur-\\nullpunkt,%
0/Gefrierpunkt\\ von Wasser,%
37/K{\"o}rper-\\temperatur,%,
100/Siedepunkt\\ von Wasser%
}
% ============================

und dann

Öffne in Overleaf
\thermo{22}

um die Skalen 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 einstellen; ist mir aber gerade zu mühsam.

Mit entsprechendem Auskommentieren kann man auch nur zwei oder nur ein Thermometer anzeigen, z.B.

alt text

Öffne in Overleaf
% thermo v1.2a
\documentclass[]{article}
%\documentclass[margin=5pt, tikz]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc, math}
\usepackage{amssymb, mwe}

\begin{document}

% Eingaben ======================
\pgfmathsetmacro{\HoeheSkala}{5.0}
\pgfmathsetmacro{\Breite}{0.9}  % 1.4
\pgfmathtruncatemacro{\TemperaturMin}{-274}
\pgfmathtruncatemacro{\TemperaturMax}{105}
\pgfmathsetmacro{\unterteilungstiefe}{5} % kleine Skala (minor ticks)
\pgfmathsetmacro{\Unterteilungstiefe}{20}% große Skala (major ticks)
% ============================
% Feste Werte anzeigen
\def\List{%
%-273.15/Absoluter\\ Temperatur-\\nullpunkt,%
0/Gefrierpunkt\\ von Wasser,%
37/K{\"o}rper-\\temperatur,%,
100/Siedepunkt\\ von Wasser%
}
% ============================

% 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 
\pgfmathsetmacro{\a}{0}         % 0
\pgfmathsetmacro{\b}{\Breite*1/7}   % 0.2
\pgfmathsetmacro{\c}{\Breite*2/7}   % 0.4
\pgfmathsetmacro{\d}{\Breite*3/7}   % 0.6
\pgfmathsetmacro{\e}{\Breite*4/7}   % 0.8
\pgfmathsetmacro{\f}{\Breite*5/7}   % 1.0
\pgfmathsetmacro{\g}{\Breite*6/7}   % 1.2
\pgfmathsetmacro{\h}{\Breite}       % 1.4
%
\coordinate[] (a) at (\a,0);
\coordinate[] (b) at (\b,0);
\coordinate[] (c) at (\c,0);
\coordinate[] (d) at (\d,0);
\coordinate[] (e) at (\e,0);
\coordinate[] (f) at (\f,0);
\coordinate[] (g) at (\g,0);
\coordinate[] (h) at (\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,-0.3);
\coordinate[] (B) at (0,-0.6);
\coordinate[] (C) at (0,-1);
\coordinate[] (D) at (0,-1.2);
\coordinate[] (E) at (0,-1.5);
\coordinate[] (F) at (0,-2.5);
\coordinate[] (G) at (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 \List {
\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/\Name in \List {%%
\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/\Name in \List {%%
\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 C-F-K
% Festanzuzeigende Werte 
\foreach[count=\i] \t/\Name in \List {%%
\draw[very thin] (p\i) -- (q\i) -- (r\i);
}%%
% Variabler Wert
\newcommand\MitKelvin{\draw[thick] (p) -- (q) -- (r);}
\MitKelvin

% Verbindungslinien C-F
% Festanzuzeigende Werte 
\foreach[count=\i] \t/\Name in \List {%%
\draw[very thin] (p\i) -- (q\i);
}%%
% Variabler Wert
\draw[thick] (p) -- (q);

% Koordinaten anzeigen
%\foreach \x in {a,...,h}
%\fill[red] (\x) circle (1pt) node[below]{\x};
%%
%\foreach \y in {A,...,G,P,Q}
%\fill[red] (\y) circle (1pt) node[below]{\y};
%%
%\draw[red, |<->|] (2,0) -- (2,\HoeheSkala) node[midway, above=1mm, sloped]{\HoeheSkala};
%\node[font=\normalsize] at (3,-3){\pgfmathparse{Fahrenheit(90)}\pgfmathresult};

\end{tikzpicture}
}%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\lipsum[66]
\thermo{22}

\lipsum[66]
%\thermo{-15}
%
%\thermo{100}

%\lipsum[66]

\end{document}
Permanenter link

beantwortet 17 Apr '18, 20:59

cis's gravatar image

cis
9.5k75452491
Akzeptiert-Rate: 29%

bearbeitet 20 Apr '18, 16:19

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×728
×16

gestellte Frage: 17 Apr '18, 20:56

Frage wurde gesehen: 6,160 Mal

zuletzt geändert: 20 Apr '18, 16:19