레코드와 같은 데이터 구조?

레코드와 같은 데이터 구조?

다음과 같은 것이 필요합니다.

\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

본질적으로 제어 순서 \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}

두 가지 유형의 과제가 추가되었습니다.

  • 별명via \recordalias{<first>}{<second>}- <second>레코드를 의 별칭으로 만듭니다 <first>.
  • 복사via - 다음 에서 제공하는 목록 처리를 사용하여 모든 \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}

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

관련 정보