自分のパッケージに新しいコマンドを作成する

自分のパッケージに新しいコマンドを作成する

何か間違っているのは確かですが、正確に何が間違っているのかわかりません。

論文を書いているときに定数用のパッケージを作成しましたが、問題なく動作します。

\def \earthRadius {\num{6.371e6}\si{\metre}}
\def \lightSpeed {\num{2.99793e8}\si{\metre\per\second}}
\def \lightSpeedAprox {\num{3e8}\si{\metre\per\second}}

\num はデフォルトで科学的に設定されていますが、スタイル上、いくつかの場所に小数点数を追加する必要がありました。そこで、次のような新しいコマンドを追加することにしました。

\newcommand{\thanum}[1]{\num[scientific-notation=false]{#1}}

要点は、これを他のマクロと一緒にパッケージに入れたいのですが、\latex がそれを好まないようです。メイン ファイルで同じコマンドを使用すると正常に動作しますが、パッケージで実行すると、次のメッセージが表示されます。

! LaTeX Error: Command \thanum already defined.
               Or name \end... illegal, see p.192 of the manual.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
 ...                                              

l.9 ...um}[1]{\num[scientific-notation=false]{#1}}

TeXworks と ShareLatex の両方で同じエラーが発生します。現在、移植性のために私が行っている方法は、main.tex で空のマクロを宣言し、パッケージで renewcommand を実行することです。これは機能しますが、マクロ全体をパッケージにカプセル化する必要があるように感じます。何が間違っているのでしょうか?


問題を再現して、sharelatex で編集可能な公開プロジェクトを作成しました:https://www.sharelatex.com/project/551003850f9d21382c0e5437

答え1

誤って 2 回定義されていないか確認してください\thanum

また、Joseph Wright がコメントですでに指摘しているように、数値と単位を組み合わせてタイプセットする場合は、and\SIではなく、 を個別に使用する必要があります。\num\si

また、短縮マクロを定義するので\newcommandはなく、を使用することを検討してください\def。そうすれば、マクロを定義して、オプション引数デフォルトでは未使用または空です。これにより、必要に応じて、書式設定の一部を「オンザフライ」で簡単に上書きできるようになります。

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

\documentclass{article}

\usepackage{siunitx}
\newcommand\earthRadius[1][]{%
    \SI[tight-spacing,#1]
    {6.371e6}{\metre}}
\newcommand\lightSpeed[1][]{%
    \SI[tight-spacing,per-mode=symbol,group-digits=false,#1]
    {2.99793e8}{\metre\per\second}}
\newcommand\lightSpeedApprox[1][]{%
    \SI[tight-spacing,per-mode=symbol,#1]
    {3e8}{\metre\per\second}}

\begin{document}
\renewcommand\arraystretch{1.25}
\begin{tabular}{ll}
\earthRadius      & \earthRadius[tight-spacing=false]\\
\lightSpeed       & \lightSpeed[group-digits=true]\\
\lightSpeedApprox & \lightSpeedApprox[per-mode=reciprocal]\\
\end{tabular}
\end{document}

答え2

適切な最小限の例を作成するのではなく、外部サイトへのリンクを投稿しないでください。これにより、サポートが難しくなり、まったく同じ問題を抱える将来のユーザーにとって、あなたの質問はほとんど価値がないものになります。

問題はメイン.texファイルに次の行が含まれていることです

\input{thabeatmacros.sty}
\usepackage{thabeatmacros}

パッケージ ファイルを読み取り\input、その内容を処理します。コマンドなどを作成します。

次に、ファイルを再度入力し、その内容を再度処理するパッケージをロードします。これにより、既存のコマンドを再度作成しようとします。当然、名前はすでに使用されており、LaTeX は、新しいコマンドであると伝えても、既存のコマンドを上書きすることを拒否します。

解決策は、最初の行を削除するだけです。パッケージは\inputそのような状態になってはなりません。常に を使用する必要があります\usepackage{}

\usepackage{thabeatmacros}

また、再定義コマンドは であり\renewcommand、 ではないことにも注意してください\rewnewcommand。ただし、いずれにしても、ここで必要なのは明らかにそれではありません。

したがって:

\begin{filecontents}{thabeatmacros.sty}
\ProvidesPackage{thabeatmacros}[2016/02/23 v1.0 My own macros]

\newcommand* \earthRadius {\SI{6.371e6}{\metre}}
\newcommand* \lightSpeed {\SI{2.99793e8}{\metre\per\second}}
\newcommand* \lightSpeedAprox {\SI{3e8}{\metre\per\second}}
\newcommand*{\thanum}[1]{\num[scientific-notation=false]{#1}}

\endinput
\end{filecontents}
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{siunitx}
\usepackage{amsmath}
\usepackage{thabeatmacros}

\begin{document}

\section{Introduction}

There is a theory which states that if ever anyone discovers exactly what the Universe is for and why it is here, it will instantly disappear and be replaced by something even more bizarre and inexplicable.
There is another theory which states that this has already happened.

\subsection*{TESTING DEFs WORK}

\begin{itemize}
  \item {\huge\earthRadius\par}
  \item {\huge\lightSpeed\par}
\end{itemize}

\end{document}

固定マクロ

関連情報