Necesitaría algo como esto:
\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
¿Existe un paquete para esto? Podría vivir sin el assign
mando.
Respuesta1
Esencialmente \setfield
es un \def
proceso donde la secuencia c
de control se construye utilizando los dos primeros argumentos. simplemente establece la secuencia de control solicitada (no se realiza ninguna verificación de errores; ... devuelve si el registro/campo no existe).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}
Se añaden dos tipos de asignaciones:
- aliasvia
\recordalias{<first>}{<second>}
- esto convierte el<second>
registro en un alias para<first>
; - Copiarvía
\recordcopy{<first>}{<second>}
: esto copia secuencialmente todos los campos desde<first>
el<second>
procesamiento de lista proporcionado poretoolbox
.
Respuesta2
\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}
Si los datos están en un archivo, tampoco hay problema. Tenga en cuenta que \readdef
, mientras lee el archivo, se establece \ncols
en el número de campos detectados en la primera fila y se puede utilizar, en lugar de un explícito 2
, para el archivo \readarray
. También muestro el uso de un separador diferente (coma en lugar de espacio) y muestro cómo la *
opción \readarray
eliminará los espacios iniciales y finales.
\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}
FINALMENTE, si cambiar los datos de la celda sobre la marcha es un requisito, implemento aquí la macro \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}