다음과 같은 것이 필요합니다.
\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
는 처음 두 인수를 사용하여 구성됩니다 . 단지 요청된 제어 순서를 설정합니다(오류 검사는 수행되지 않습니다. ... 레코드/필드가 존재하지 않으면 반환됩니다 ).\def
c
s
name
\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}