Datensatzähnliche Datenstruktur?

Datensatzähnliche Datenstruktur?

Ich bräuchte so etwas:

\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

Gibt es dafür ein Paket? Ich könnte ohne den assignBefehl leben.

Antwort1

Im Wesentlichen \setfieldhandelt es sich dabei um ein \def, bei dem die cSteuersequenz unter Verwendung der ersten beiden Argumente erstellt wird. legt lediglich die angeforderte sSteuersequenz fest (es wird keine Fehlerprüfung durchgeführt; ... wird zurückgegeben , wenn der Datensatz/das Feld nicht vorhanden ist).name\getfield\csname\endcsname\relax

Bildbeschreibung hier eingeben

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

Hinzugefügt sind zwei Arten von Aufgaben:

  • aliasvia \recordalias{<first>}{<second>}– dies macht den <second>Datensatz zu einem Alias ​​für <first>;
  • Kopierenvia \recordcopy{<first>}{<second>}- dies kopiert sequenziell alle Felder von <first>in <second>mithilfe der Listenverarbeitung vonetoolbox.

Antwort2

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

Bildbeschreibung hier eingeben

Wenn die Daten in einer Datei sind, ist das auch kein Problem. Beachten Sie \readdef, dass beim Lesen der Datei \ncolsauf die Anzahl der in der ersten Zeile erkannten Felder gesetzt wird und anstelle eines expliziten 2für verwendet werden kann \readarray. Ich demonstriere auch die Verwendung eines anderen Trennzeichens (Komma statt Leerzeichen) und zeige, wie die *Option von \readarrayführende und nachfolgende Leerzeichen entfernt.

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

Bildbeschreibung hier eingeben

ENDLICH, wenn eine schnelle Änderung der Zelldaten erforderlich ist, implementiere ich hier das Makro \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}

Bildbeschreibung hier eingeben

verwandte Informationen