¿Es posible en Latex convertir todos los números entre imperiales y métricos?

¿Es posible en Latex convertir todos los números entre imperiales y métricos?

Esta pregunta condujo a un nuevo paquete:
smartunits

Actualmente estoy escribiendo un documento que me gustaría presentar al público europeo y americano. El problema es, como siempre, la elección entre unidades imperiales y métricas.

El texto no es científico y no está destinado a una audiencia científica, por lo que no puedo simplemente usar unidades métricas hasta el final y dar por terminado el día. Dado que muchas de las unidades están enterradas en el texto, encontrarlas todas y cambiarlas es bastante engorroso (incluso con el uso de comentarios ocultos como indicadores de guía).

Lo que busco es un método para ofrecer lo mejor de ambos mundos. Estoy buscando algo que pueda convertir todas las unidades métricas a imperiales y viceversa. El esquema ideal sería este:

\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}

Lo que con suerte debería resultar en:

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

La idea detrás de esto sería que las unidades se puedan controlar desde el preámbulo, sin tener que alterar el texto.

¿Existe un paquete de este tipo disponible o es fácilmente posible crear mi propia solución (no soy tan bueno codificando y nunca antes había intentado escribir nada en Tex)?

Eché un vistazo al paquete siunitx, pero no hay nada allí sobre convertir unidades de un lado a otro.

Editar: Según el comentario de Joseph Wright, algunos detalles más: las unidades a convertir serían, como mínimo, de peso, longitud y tiempo (siendo esta última opcional, pero ventajosa). La conversión debe realizarse del sistema métrico estándar (kilogramos, metros, formato 24:00) al imperial (libras, pies, formato 12 AM/PM).

Si yo personalmente estuviera escribiendo un paquete, probablemente permitiría ciertos indicadores de comando (por ejemplo: kilómetros deberían traducirse a millas, no a miles de pies), y la altura del cuerpo (digamos 189 cm) debería convertirse a 6'2'', no a "2 yardas".

Me doy cuenta de que hacer esto bien para cada escenario posible (altura del cuerpo, altura de la montaña, distancia pequeña, distancia grande, etc., etc.) es algo complejo (principalmente gracias a las partes extrañas del sistema imperial). En cuanto a la precisión: dado que no está escrito para una audiencia científica, cualquier redondeo al punto decimal está bien. Es decir: 1 metro se puede convertir fácilmente en 3 pies, aunque no sea realmente exacto. Por supuesto, si fuera necesaria una mayor precisión, sería necesario un punto de redondeo.

Segunda edición: un truco simple que creo que también podría funcionar (incluso si no es realmente elegante) es una forma en látex de definir dos palabras. Por ejemplo:

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

Con alguna posibilidad de elegir cuál queda seleccionado en el preámbulo. Esto obligaría al usuario a convertir todo por sí mismo, pero al menos permitiría un fácil intercambio entre unidades.

Respuesta1

Implementar tu truco es bastante fácil:

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

Luego puede simplemente usarlo \MyUnit{191cm}{6'3''}en su documento y cambiar entre métrico e imperial en cualquier momento usando \Metrictruey \Metricfalse.

Aquí hay un ejemplo completo (con un uso crudo deUnidades SIcomo se solicita en los comentarios):

\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}

y la salida:

ingrese la descripción de la imagen aquí

Editar: el paquete smartunits

Cuando escribí esta publicación por primera vez dije que debería ser posible hacer esto correctamente usandoclavespgf. En parte como prueba de concepto y en parte como ejercicio para aprender a utilizar pgfkeys, ahora existe unaunidades inteligentesPaquete para convertir entre unidades métricas e imperiales.

Aquí hay un 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}

y aquí está el resultado que esto produce:

ingrese la descripción de la imagen aquí (Hay algunos trucos al usar ellistadospaquete para que LateX escriba los comandos después de %'s en cada línea).

Respuesta2

Para completar, una opción es simplemente hacer las conversiones de unidades en LaTeX, usando algo como pgf/tikz ofp. Personalmente, soy de la opinión de que esta no es una solución ideal, ya que hay muchos casos extremos (como, por ejemplo, cuándo convertir entre metros y kilómetros, o cuánto redondear). Sin embargo, puede ser suficiente para un uso no científico. Dejando de lado esa advertencia, aquí hay una posible implementación.

Primero, configuramos una bandera para seleccionar entre unidades métricas e imperiales.

\newif\ifmetric\metrictrue

Luego podemos comenzar implementando una macro que cambia entre 24 horas y 12 horas, dependiendo del estado de esta bandera. Supondremos que ingresamos una hora en formato de 24 horas y la convertiremos a 12 horas si es necesario.

\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%
}

Básicamente, lo que esto hace es comprobar si el primer argumento (las horas) es mayor que 12. Si es así, utiliza el paquete fp \FPevalpara restar 12 del número de horas. La hora es entonces ese nuevo número de horas, seguida de los minutos y PM. De lo contrario, simplemente agregamos un AM al final del tiempo. En realidad, esto debería funcionar completamente para sus necesidades.

A continuación, hagamos la conversión entre dos unidades, digamos kilogramos y libras.

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

Nuevamente simplemente hacemos los cálculos usando \FPevalnuestra bandera para cambiar entre unidades métricas e imperiales.

Convertir entre metros y pies más pulgadas es un poco más complicado, pero no es fundamentalmente diferente de cómo convertimos kilogramos a libras.

% 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%
}

Si también trabaja con kilómetros, podría tener sentido definir algo como esto:

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

Lo que esto hace es multiplicar cualquier número que le des por 1000 y lo coloca en la \smartmetermacro. Utiliza el nombre de la macro ( \smartmetervs \smartkilometer) para realizar un seguimiento de las unidades.

Con esas macros definidas, el siguiente código:

\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}!

se convierte en esto:

ingrese la descripción de la imagen aquí

información relacionada