この質問から新しいパッケージが生まれました:
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
マクロの名前 ( \smartmeter
vs ) を使用します。\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}!
こうなります: