Ist es in Latex möglich, alle Zahlen zwischen imperialen und metrischen Maßen umzurechnen?

Ist es in Latex möglich, alle Zahlen zwischen imperialen und metrischen Maßen umzurechnen?

Diese Frage führte zu einem neuen Paket:
smartunits

Ich schreibe derzeit ein Dokument, das ich sowohl einem europäischen als auch einem amerikanischen Publikum zur Verfügung stellen möchte. Das Problem ist wie immer die Wahl zwischen imperialen und metrischen Einheiten.

Der Text ist nicht wissenschaftlich und auch nicht für ein wissenschaftliches Publikum gedacht. Ich kann also nicht einfach durchgängig metrische Einheiten verwenden und damit Schluss machen. Da viele der Einheiten im Text verborgen sind, ist es ziemlich mühsam, sie alle zu finden und zu ändern (selbst mit versteckten Kommentaren als Orientierungshilfe).

Ich suche nach einer Methode, die das Beste aus beiden Welten bietet. Ich suche nach etwas, das alle metrischen Einheiten in imperiale Einheiten und umgekehrt umrechnen kann. Das ideale Schema würde so aussehen:

\usepackage{smart_unit_package}

\smart_unit_convert{imperial}
...

\begin{document}
Oscar Wilde's height is said to have been \smart_unit{1.91}{meter}.
\end{document}

Das Ergebnis sollte hoffentlich sein:

Oscar Wilde's height is said to have been 6'3''

Die Idee dahinter wäre, dass die Einheiten aus der Präambel heraus gesteuert werden können, ohne den Text verändern zu müssen.

Gibt es ein solches Paket oder ist es problemlos möglich, eine eigene Lösung zu erstellen (ich bin nicht so gut im Programmieren und habe noch nie zuvor versucht, etwas in Tex zu schreiben)?

Ich habe mir das siunitx-Paket angesehen, aber dort steht nichts über die Umrechnung von Einheiten in beide Richtungen.

Bearbeiten: Gemäß Joseph Wrights Kommentar noch ein paar weitere Details: Die umzurechnenden Einheiten wären mindestens für Gewicht, Länge und Zeit (letztere ist optional, aber vorteilhaft). Die Umrechnung sollte vom metrischen Standardsystem (Kilogramm, Meter, 24:00-Format) ins imperiale System (Pfund, Fuß, 12-Uhr-Format) erfolgen.

Wenn ich persönlich ein Paket schreiben würde, würde ich wahrscheinlich bestimmte Befehlsflags zulassen (z. B.: Kilometer sollte in Meilen und nicht in Tausende von Fuß umgerechnet werden) und die Körpergröße (sagen wir 189 cm) sollte in 6'2'' und nicht in „2 Yards“ umgerechnet werden.

Mir ist klar, dass es ziemlich kompliziert ist, dies für jedes mögliche Szenario (Körpergröße, Berghöhe, kleine Entfernung, große Entfernung usw. usw.) richtig hinzubekommen (hauptsächlich aufgrund der seltsamen Teile des imperialen Systems). Was die Genauigkeit betrifft: Da es nicht für ein wissenschaftliches Publikum geschrieben ist, ist jede Aufrundung auf die Dezimalstelle in Ordnung. D. h.: 1 Meter kann leicht in 3 Fuß umgewandelt werden, auch wenn dies nicht wirklich genau ist. Wenn eine höhere Genauigkeit erforderlich wäre, wäre natürlich ein Rundungspunkt erforderlich.

Zweite Änderung: Ein einfacher Hack, der meiner Meinung nach auch funktionieren könnte (auch wenn er nicht wirklich elegant ist), ist eine Möglichkeit in Latex, zwei Wörter zu definieren. Zum Beispiel:

Oscar Wilde's height is said to have been \twowords{191cm}{6'3''}.

Mit einer gewissen Auswahlmöglichkeit in der Präambel. Dies würde den Benutzer zwingen, alles selbst umzurechnen, aber es würde zumindest einen einfachen Wechsel zwischen Einheiten ermöglichen.

Antwort1

Die Implementierung Ihres Hacks ist ganz einfach:

\newif\ifMetric\Metrictrue% metric by default
\newcommand\MyUnit[2]{\ifMetric #1\else #2\fi}% \MyUnits{metric}{imperial}

Anschließend können Sie \MyUnit{191cm}{6'3''}in Ihrem Dokument einfach verwenden und jederzeit mit \Metrictrueund zwischen metrischen und imperialen Maßen wechseln \Metricfalse.

Hier ist ein vollständiges Beispiel (mit einer groben Verwendung vonSI-Einheitenwie in den Kommentaren gefordert):

\documentclass{article}
\usepackage{SIunits}
\newif\ifMetric\Metrictrue% metric by default
\newcommand\MyUnit[2]{\ifMetric #1\else #2\fi}% \MyUnits{metric}{imperial}

\begin{document}
   Metric: \MyUnit{191 \centi\meter}{$6'3''$}

   \Metricfalse Imperial:  \MyUnit{191 \centi\meter}{$6'3''$}

   \Metrictrue Metric:  \MyUnit{191 \centi\meter}{$6'3''$}
\end{document}

und die Ausgabe:

Bildbeschreibung hier eingeben

Bearbeiten: das Smartunits-Paket

Als ich diesen Beitrag schrieb, sagte ich, dass es möglich sein sollte, dies richtig zu tun, indem manpgf-Schlüssel. Teilweise als Proof-of-Concept und teilweise als Übung zum Erlernen der Verwendung von pgfkeysgibt es jetzt eineSmarteinheitenPaket zur Umrechnung zwischen metrischen und imperialen Einheiten.

Hier ist ein MWE:

\documentclass{article}
\usepackage{smartunits}
\usepackage{xcolor}
\usepackage{listings}\lstset{language=[LaTeX]TeX}
\lstset{language=[LaTeX]TeX,
        texcsstyle=*\bfseries\color{blue},
        keywordstyle=\color{blue},
        commentstyle=\color{brown},
        morekeywords={SmartUnit,SmartUnitSettings,sisetup},
}

\begin{document}
  \begin{lstlisting}[texcl]
      \SmartUnitSettings{metric imperial, places=1}
      \SmartUnit{km=100.0,figures=1}   % \SmartUnit{km=100.0,figures=1}
      \SmartUnit{miles=62.15,places=1} % \SmartUnit{miles=62.15,places=1}
      \SmartUnit{cm=10}                % \SmartUnit{cm=10}
      \SmartUnit{celsius=20}           % \SmartUnit{celsius=20}
      \SmartUnit{miles=5.0, figures=1} % \SmartUnit{miles=5.0, figures=1}
      \SmartUnit{miles=5.0,places=2}   % \SmartUnit{miles=5.0, places=2}
      \SmartUnit{hours=0, minutes=59}  % \SmartUnit{hours=0, minutes=59}
      \SmartUnit{hours=12, minutes=12} % \SmartUnit{hours=12, minutes=12}
      \SmartUnit{kg=10.0, places=1}    % \SmartUnit{kg=10.0, places=1}
      \SmartUnit{pound=10.0,figures=1} % \SmartUnit{pound=10.0,figures=1}
      \SmartUnit{l=10.0, places=1}     % \SmartUnit{l=10.0, places=1}
      \SmartUnit{L=10.0, places=1,uk}  % \SmartUnit{L=10.0, places=1,uk}
  \end{lstlisting}
\end{document}

und hier ist die Ausgabe, die dies erzeugt:

Bildbeschreibung hier eingeben (Es gibt einige Tricks mit demInseratePaket, damit LateX die Befehle nach den %'s in jeder Zeile setzt.)

Antwort2

Der Vollständigkeit halber besteht eine Möglichkeit darin, die Einheitenumrechnungen einfach in LaTeX durchzuführen, beispielsweise mit pgf/tikz oderfp. Ich persönlich bin der Meinung, dass dies keine ideale Lösung ist, da es viele Randfälle gibt (wie zum Beispiel, wann zwischen Metern und Kilometern umgerechnet werden muss oder wie viel gerundet werden muss). Für eine nichtwissenschaftliche Verwendung kann es jedoch ausreichend sein. Nachdem dieser Vorbehalt geklärt ist, folgt hier eine mögliche Implementierung.

Zuerst richten wir eine Flagge ein, um zwischen metrischen und imperialen Einheiten auszuwählen.

\newif\ifmetric\metrictrue

Wir können dann mit der Implementierung eines Makros beginnen, das je nach Status dieses Flags zwischen 24-Stunden- und 12-Stunden-Zeit wechselt. Wir gehen davon aus, dass wir eine Zeit im 24-Stunden-Format eingeben und sie bei Bedarf in eine 12-Stunden-Zeit umwandeln.

\def\smarttime#1#2{%
  \ifmetric%
    #1:#2%
  \else%
    \ifnum#1>12%
      \FPeval{\result}{trunc(#1 - 12:0)}%
      \result:#2 PM%
    \else%
      #1:#2 AM%
    \fi%
  \fi%
}

Im Grunde wird hiermit überprüft, ob das erste Argument (die Stunden) größer als 12 ist. Wenn dies der Fall ist, werden die fp-Pakete verwendet, \FPevalum 12 von der Stundenzahl abzuziehen. Die Zeit ist dann diese neue Stundenzahl, gefolgt von den Minuten und PM. Andernfalls fügen wir am Ende der Zeit einfach ein AM hinzu. Dies sollte für Ihre Anforderungen eigentlich völlig funktionieren.

Als Nächstes führen wir die Umrechnung zwischen zwei Einheiten durch, beispielsweise Kilogramm und Pfund.

\def\smartkilogram#1{%
  \ifmetric%
    #1 kg%
  \else%
    \FPeval{\result}{round(#1 * 2.204:1)}%
    \result\ lbs%
  \fi%
}

Auch hier führen wir die Berechnung einfach durch \FPevalund verwenden unsere Flagge, um zwischen metrischen und imperialen Einheiten zu wechseln.

Die Umrechnung zwischen Metern und Fuß sowie Zoll ist etwas komplizierter, unterscheidet sich aber nicht grundsätzlich von der Umrechnung von Kilogramm in Pfund.

% Conditionally converts meters to miles/feet/inches
\def\smartmeter#1{%
  % Use metric units (meters)
  \ifmetric%
    \FPeval{\result}{trunc(#1:0)}%
    \ifnum\result>1000%
      \FPeval{\result}{trunc(#1/1000:1)}%
      \result\ km%
    \else%
      \FPeval{\result}{trunc(#1:2)}%
      \result\ m%
    \fi%
  % Use imperial units (feet and inches)
  \else
   \FPeval{\result}{trunc((3.281 * #1):0)}%
   \ifnum\result<5280%
     \FPeval{\result}{(3.281 * #1)}%
     \FPeval{\feet}{trunc((\result):0)}%
     \FPeval{\inch}{trunc((12 * ((\result) - (\feet))):0)}%
     \feet'\inch"%
    \else
     \FPeval{\feet}{trunc((\result):0)}%
     \FPeval{\miles}{trunc((\feet / 5280):1)}%
     \miles\ miles%
   \fi%
  \fi%
}

Wenn Sie auch mit Kilometern arbeiten, kann es sinnvoll sein, etwa Folgendes zu definieren:

\def\smartkilometer#1{\FPeval{\result}{trunc((#1 * 1000):0)}\smartmeter{\result}}

Dabei wird die von Ihnen eingegebene Zahl mit 1000 multipliziert und das Ergebnis in das \smartmeterMakro eingefügt. Dabei wird der Name des Makros ( \smartmetervs \smartkilometer) verwendet, um die Einheiten zu verfolgen.

Mit diesen definierten Makros ergibt sich der folgende Code:

\subsection*{Metric Units}
\metrictrue
Oscar Wilde's height is said to have been \smartmeter{1.91}.\\

Five kilometers is \smartkilometer{5}.\\

It is \smarttime{9}{00}. Later it will be \smarttime{13}{30}.\\

That ostrich weights \smartkilogram{100}!

\subsection*{Imperial Units}
\metricfalse
Oscar Wilde's height is said to have been \smartmeter{1.91}.\\

Five kilometers is \smartkilometer{5}.\\

It is \smarttime{9}{00}. Later it will be \smarttime{13}{30}.\\

That ostrich weights \smartkilogram{100}!

wird dies:

Bildbeschreibung hier eingeben

verwandte Informationen