Latex ですべての数値をヤードポンド法とメートル法の間で変換することは可能ですか?

Latex ですべての数値をヤードポンド法とメートル法の間で変換することは可能ですか?

この質問から新しいパッケージが生まれました:
smartunits

私は現在、ヨーロッパとアメリカの両方の読者に配布したい文書を書いています。問題は、いつものように、ヤードポンド法とメートル法のどちらを選択するかです。

このテキストは科学的なものではなく、科学的な読者を対象にしたものでもないため、最初から最後までメートル法の単位を使用して終わりにすることはできません。多くの単位がテキスト内に埋め込まれているため、すべての単位を見つけて変更するのは非常に面倒です (隠れたコメントをガイドフラグとして使用しても)。

私が探しているのは、両方の長所を活かす方法です。すべてのメートル法単位をヤードポンド法に、またその逆に変換できるものを探しています。理想的なスキームは次のようになります。

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

結果として次のようになることが期待されます:

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

その背後にある考え方は、テキストを変更することなく、ユニットをプリアンブルから制御できるというものです。

そのようなパッケージは利用可能でしょうか、それとも独自のソリューションを簡単に作成することは可能でしょうか (私はコーディングが得意ではなく、これまで Tex で何かを書いたことすらありません)?

siunitx パッケージを調べてみましたが、単位の相互変換に関する情報は何もありませんでした。

編集: Joseph Wright のコメントに従って、さらに詳細をいくつか説明します。変換する単位は、少なくとも、重量、長さ、時間 (最後の単位はオプションですが、あると便利です) です。変換は、標準メートル法 (キログラム、メートル、24:00 形式) から帝国単位法 (ポンド、フィート、12 AM/PM 形式) に行う必要があります。

私が個人的にパッケージを作成する場合、おそらく特定のコマンド フラグ (例: キロメートルは 1000 フィートではなくマイルに変換される) を許可し、身長 (たとえば 189 cm) は「2 ヤード」ではなく「6 フィート 2 インチ」に変換されるでしょう。

あらゆる可能性のあるシナリオ (身長、山の高さ、短い距離、長い距離など) でこれを正しく行うことは、やや複雑です (主にヤードポンド法の奇妙な部分のせいです)。正確性について: 科学的な読者向けに書かれたものではないため、小数点以下を切り上げても問題ありません。つまり、1 メートルは、実際には正確ではないとしても、簡単に 3 フィートに変換できます。もちろん、より正確性が必要な場合は、切り捨てポイントが必要になります。

2 回目の編集: うまくいくかもしれないと思う簡単なハック (あまりエレガントではありませんが) は、LaTeX で 2 つの単語を定義する方法です。たとえば、次のようになります。

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

プリアンブルでどれを選択するかを選択できる可能性があります。これにより、ユーザーはすべてを自分で変換する必要がありますが、少なくとも単位間の交換は簡単になります。

答え1

ハックの実装は非常に簡単です:

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

その後、\MyUnit{191cm}{6'3''}ドキュメント内で を使用し、 と を使用していつでもメートル法とヤードポンド法を切り替えること\Metrictrueができます\Metricfalse

完全な例を以下に示します(SI単位コメントでリクエストされたとおり):

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

出力は次のようになります。

ここに画像の説明を入力してください

編集: smartunits パッケージ

最初にこの記事を書いたとき、これを適切に実行できるはずだと言いました。pgfキー概念実証として、また使い方を学ぶための練習としてpgfkeys、現在、スマートユニットメートル法とヤードポンド法の単位を変換するためのパッケージ。

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}

生成される出力は次のようになります。

ここに画像の説明を入力してくださいリスト%パッケージを使用すると、各行の 's の後のコマンドが LateX でタイプセットされます。

答え2

完全性のために、1つの選択肢は、pgf/tikzまたはファッショナブル. 個人的には、これは理想的なソリューションではないと考えています。なぜなら、多くのエッジケース (たとえば、メートルとキロメートルをいつ変換するか、またはどのくらい丸めるかなど) があるからです。ただし、非科学的な用途には十分かもしれません。その注意事項を除けば、可能な実装は次のとおりです。

まず、メートル法とヤードポンド法の単位を選択するためのフラグを設定します。

\newif\ifmetric\metrictrue

次に、このフラグの状態に応じて 24 時間制と 12 時間制を切り替えるマクロを実装することから始めます。時刻を 24 時間制で入力し、必要に応じて 12 時間制に変換するものとします。

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

基本的に、これは最初の引数 (時間) が 12 より大きいかどうかを確認します。大きい場合は、fp パッケージを使用して\FPeval時間数から 12 を減算します。すると、新しい時間数になり、その後に分と PM が続きます。それ以外の場合は、時間の最後に AM を追加します。これは実際には完全にニーズに合うはずです。

次に、キログラムとポンドの 2 つの単位間の変換をしてみましょう。

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

ここでも、フラグを使用して計算を行い\FPeval、メートル法とヤードポンド法の単位を切り替えます。

メートルとフィート+インチの変換は少し複雑ですが、キログラムをポンドに変換する方法と基本的に変わりません。

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

キロメートルも扱う場合は、次のように定義すると良いでしょう。

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

これは、指定した数値を 1000 倍にして、その結果をマクロに入力します。単位を追跡するために、\smartmeterマクロの名前 ( \smartmetervs ) を使用します。\smartkilometer

これらのマクロを定義すると、次のコードになります。

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

こうなります:

ここに画像の説明を入力してください

関連情報