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 형식)으로 이루어져야 합니다.

개인적으로 패키지를 작성하는 경우 특정 명령 플래그(예: 킬로미터는 수천 피트가 아닌 마일로 변환되어야 함)와 신체 높이(예: 189cm)가 6'2''로 변환되어야 함을 허용할 것입니다. "2 야드"로.

나는 가능한 모든 시나리오(신체 높이, 산 높이, 작은 거리, 먼 거리 등)에 대해 이것을 올바르게 수행하는 것이 다소 복잡하다는 것을 알고 있습니다(주로 제국 시스템의 이상한 부분으로 인해). 정확성: 과학적인 독자를 대상으로 작성된 것이 아니므로 소수점 이하까지 반올림해도 괜찮습니다. 즉, 1미터는 실제로 정확하지는 않더라도 쉽게 3피트로 변환될 수 있습니다. 물론, 더 많은 정확도가 필요하다면 반올림 지점이 필요할 것입니다.

두 번째 편집: (실제로 우아하지는 않더라도) 효과가 있을 것으로 생각되는 간단한 해킹은 라텍스에서 두 단어를 정의하는 방법입니다. 예를 들어:

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 패키지

처음 이 게시물을 썼을 때 나는 다음을 사용하여 이 작업을 올바르게 수행하는 것이 가능해야 한다고 말했습니다.pgfkeys. 부분적으로는 개념 증명으로, 부분적으로는 사용법을 배우기 위한 연습으로 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}

이것이 생성하는 출력은 다음과 같습니다.

여기에 이미지 설명을 입력하세요 (사용하는 데 약간의 속임수가 있습니다.목록LateX가 각 줄의 ' 뒤에 있는 명령을 조판하도록 패키지를 설치하세요 %.)

답변2

완전성을 기하기 위해 한 가지 옵션은 pgf/tikz 또는 같은 것을 사용하여 LaTeX에서 단위 변환을 수행하는 것입니다.fp. 나는 개인적으로 이것이 이상적인 솔루션이 아니라고 생각합니다. 왜냐하면 예를 들어 미터와 킬로미터를 언제 변환해야 하는지, 얼마만큼 반올림해야 하는지와 같은 극단적인 경우가 많기 때문입니다. 하지만 비과학적인 용도로는 충분할 수 있습니다. 이러한 경고를 무시하고 가능한 구현은 다음과 같습니다.

먼저 미터법과 영국식 단위 중에서 선택하는 플래그를 설정합니다.

\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을 추가하면 됩니다. 이것은 실제로 귀하의 요구에 완벽하게 작동합니다.

다음으로, 킬로그램과 파운드 등 두 단위 사이의 변환을 해보겠습니다.

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

다음과 같이 됩니다:

여기에 이미지 설명을 입력하세요

관련 정보