レコードのようなデータ構造ですか?

レコードのようなデータ構造ですか?

次のようなものが必要です:

\setfield{record1}{field1}{alpha}
\setfield{record1}{field2}{beta}
\setfield{record2}{field1}{gamma}
\setfield{record2}{field2}{delta}
\assign{record3}{record2}
\getfield{record1}{field1} % should expand to alpha
\getfield{record1}{field2} % should expand to beta
\getfield{record2}{field1} % should expand to gamma
\getfield{record2}{field2} % should expand to delta
\getfield{record3}{field1} % should expand to gamma
\getfield{record3}{field2} % should expand to delta

これ用のパッケージはありますか?assignコマンドがなくても大丈夫です。

答え1

本質的には、最初の 2 つの引数を使用して制御シーケンスが構築される です。要求さ\setfieldれた制御シーケンスを設定するだけです (エラー チェックは実行されません。レコード/フィールドが存在しない場合は、 ...が返されます)。\defcsname\getfield\csname\endcsname\relax

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

\documentclass{article}

\usepackage{etoolbox}

\newcommand{\setfield}[3]{%
  \expandafter\def\csname #1@#2\endcsname{#3}%
  \listcsgadd{#1}{#2}%
}
\newcommand{\getfield}[2]{%
  \ifcsname #1@alias\endcsname
    \expandafter\expandafter\expandafter\csname \csname #1@alias\endcsname @#2\endcsname
  \else
    \csname #1@#2\endcsname
  \fi}
\newcommand{\recordalias}[2]{\expandafter\def\csname #2@alias\endcsname{#1}}
\newcommand{\recordcopy}[2]{%
  \renewcommand*{\do}[1]{%
    \expandafter\edef\csname #2@##1\endcsname{\csname #1@##1\endcsname}}%
  \dolistcsloop{#1}%
}

\begin{document}

\setfield{record1}{field1}{alpha}
\setfield{record1}{field2}{$\beta$}
\setfield{record2}{field1}{gamma}
\setfield{record2}{field2}{$\delta$}

\recordalias{record2}{record3}
\recordcopy{record2}{record4}

\getfield{record1}{field1} % should expand to alpha
\getfield{record1}{field2} % should expand to $\beta$
\getfield{record2}{field1} % should expand to gamma
\getfield{record2}{field2} % should expand to $\delta$
\getfield{record3}{field1} % should expand to gamma
\getfield{record3}{field2} % should expand to $\delta$

\setfield{record2}{field1}{$\gamma$}

\getfield{record2}{field1} % should expand to $\gamma$
\getfield{record3}{field1} % should expand to $\gamma$
\getfield{record4}{field1} % should expand to gamma

\end{document}

2 種類の割り当てが追加されました。

  • エイリアスvia \recordalias{<first>}{<second>}- これにより、レコードは;<second>のエイリアスになります。<first>
  • コピー経由- これは、リスト処理を使用して、から\recordcopy{<first>}{<second>}のすべてのフィールドをに順番にコピーします。<first><second>etoolbox

答え2

\documentclass[10pt]{article}
\usepackage{readarray}
\begin{document}
\readarraysepchar{ }
\def\mydata{alpha beta gamma delta}
\readarray\mydata\myarray[-,2]% Read \mydata as 2 fields into 2-D \myarray
Cell (2,2) has \myarray[2,2]
whereas cell (1,2) has \myarray[1,2]
\end{document}

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

データがファイル内にある場合も、問題ありません。\readdefファイルの読み取り中に、 は\ncols最初の行で検出されたフィールドの数に設定され、2に対して明示的な の代わりに を使用できることに注意してください。また、別の区切り文字 (スペースの代わりにコンマ) の使用方法を示し、のオプションによって先頭と末尾のスペースが削除される\readarray方法を示します。*\readarray

\documentclass[10pt]{article}
\usepackage{readarray,filecontents}
\begin{filecontents*}{mydatafile}
alpha, beta
gamma, delta force
\end{filecontents*}
\begin{document}
\readarraysepchar{,}
\readdef{mydatafile}{\mydata}
\readarray*\mydata\myarray[-,\ncols]% Read \mydata as 2 fields into 2-D \myarray
Cell (2,2) has \myarray[2,2]
whereas cell (1,2) has \myarray[1,2]
\end{document}

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

ついにセルデータをオンザフライで変更する必要がある場合は、ここでマクロを実装します\setfield\<array name>[<row>,<column>]{<data>}

\documentclass[10pt]{article}
\usepackage{readarray}
\makeatletter
\gdef\setfield#1[#2,#3]#4{%
  \expandafter\gdef\csname\expandafter\@gobble\string#1[#2,#3]\endcsname{#4}}%
\makeatother
\begin{document}
\readarraysepchar{ }
\def\mydata{alpha beta gamma delta}
\readarray\mydata\myarray[-,2]% Read \mydata as 2 fields into 2-D \myarray
Cell (2,2) has \myarray[2,2]
whereas cell (1,2) has \myarray[1,2]

\setfield\myarray[1,2]{$\beta$}
Cell (1,2) now has \myarray[1,2].
\end{document}

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

関連情報