% \iffalse meta-comment % % Copyright (C) 2013 by Song Zhiwei % ----------------------------------------------------------- % % This file may be distributed and/or modified under the conditions of % the LaTeX Project Public License, either version 1.3c of this license % or (at your option) any later version. The latest version of this % license is in: % % http://www.latex-project.org/lppl.txt % % and version 1.3c or later is part of all distributions of LaTeX % version 2006/05/20 or later. % % \fi % % \iffalse % %<*driver> \ProvidesFile{memory.dtx} % %\NeedsTeXFormat{LaTeX2e}[2003/12/01] %\ProvidesPackage{memory} %<*memory> [2013/05/13 v1.2 containers for data of object and array in LaTeX] % %<*driver> \documentclass[a4paper]{ltxdoc} \usepackage{memory} \EnableCrossrefs \CodelineIndex \RecordChanges \OnlyDescription \begin{document} \DocInput{memory.dtx} \end{document} % % \fi % % \CheckSum{69} % % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z % Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z % Digits \0\1\2\3\4\5\6\7\8\9 % Exclamation \! Double quote \" Hash (number) \# % Dollar \$ Percent \% Ampersand \& % Acute accent \' Left paren \( Right paren \) % Asterisk \* Plus \+ Comma \, % Minus \- Point \. Solidus \/ % Colon \: Semicolon \; Less than \< % Equals \= Greater than \> Question mark \? % Commercial at \@ Left bracket \[ Backslash \\ % Right bracket \] Circumflex \^ Underscore \_ % Grave accent \` Left brace \{ Vertical bar \| % Right brace \} Tilde \~} % % \changes{v1.2}{2013/05/13}{Uses := to set the expanded value to a variable} % \changes{v1.1}{2013/05/11}{Reports warning when redeclaring a variable} % \changes{v1.0}{2013/05/10}{Initial version} % % \GetFileInfo{memory.dtx} % % \DoNotIndex{} % % \title{The \textsf{memory} package\thanks{This document % corresponds to \textsf{memory}~\fileversion, dated \filedate.}} % \author{Song Zhiwei\\\texttt{songzw@gmail.com}} % % \maketitle % % \section{Introduction} % % The package memory.sty provides an easy way to declare object or array % containers. % If you are considering to use an auxiliary file, you really need % this package rather than the heavy I/O manipulation. % % \section{Usage} % \newcommand\MyDescribeMacro[1]{\marginpar{\raggedleft\strut\MacroFont#1}} % \DescribeMacro{\newdata\marg{variable}} % \DescribeMacro{\newdata*\marg{variable}} % These macros declare data variables locally and globally, respectively. % The value for star version is also saved globally. % \begin{verbatim}\newdata{Person} % Note: no backslash for the variable declaration %\newdata*{Time}\end{verbatim}\newdata{Person} \newdata*{Time} % Uses = or := to set value. The := version sets the expanded value to variable. % \MyDescribeMacro{\textbackslash\meta{var}\oarg{p}=\marg{value}}% % \MyDescribeMacro{\textbackslash\meta{var}\oarg{p}:=\marg{value}}\\[0.5em] % -- Sets value as a single variable. % \begin{verbatim}\Person = {Song Zhiwei} % Note: add backslash for declared variable %\Time := \today\end{verbatim} % \Person = {Song Zhiwei} \Time := \today % -- Sets value as an array. % \begin{verbatim}\Person[1] = {28.3}\end{verbatim}\Person[1] = {28.3} % -- Sets value as a multiple dimensional array. % \begin{verbatim}\Time[2,5,\thesection] = {13 May 2013}\end{verbatim} % \Time[2,5,\thesection] = {13 May 2013} % -- Sets value as an object. % \begin{verbatim}\Person[description] = {A Chinese gentleman.} %\Person[hair] = {black}\end{verbatim} % \Person[description] = {A Chinese gentleman.} % \Person[hair] = {black} % -- Gets values. % \MyDescribeMacro{\textbackslash\meta{variable}\oarg{p}} % \begin{center}\newcommand\VRule{\rule[-0.2em]{0.4pt}{1.2em}} % \verb|\Person|\hfill\VRule\quad\makebox[12em][l]{\Person}\\ % \verb|\Time|\hfill\VRule\quad\makebox[12em][l]{\Time}\\ % \verb|\Person[1]|\hfill\VRule\quad\makebox[12em][l]{\Person[1]}\\ % \verb|\Time[2,5,\thesection]|\hfill\VRule\quad\makebox[12em][l]{\Time[2,5,\thesection]}\\ % \verb|\Person[description]|\hfill\VRule\quad\makebox[12em][l]{\Person[description]}\\ % \verb|\Person[hair]|\hfill\VRule\quad\makebox[12em][l]{\Person[hair]} % \end{center} % % \StopEventually{} \def\set@memory#1#2=#3{\if#1*\expandafter\gdef\csname#2\endcsname{#3}% \else\expandafter\def\csname#2\endcsname{#3}\fi} \def\eset@memory#1#2=#3{\if#1*\expandafter\xdef\csname#2\endcsname{#3}% \else\expandafter\edef\csname#2\endcsname{#3}\fi} \def\etest@memory#1#2:{\@ifnextchar={\eset@memory{#1}{#2}} {\csname #2\endcsname:}} \def\data@memory#1#2{\@ifnextchar={\set@memory{#1}{@#2@memory}} {\@ifnextchar:{\etest@memory{#1}{@#2@memory}} {\csname @#2@memory\endcsname}}} \def\array@memory#1#2[#3]{\data@memory{#1}{#2@#3}} \def\newdata@memory#1#2{\@ifundefined{#2} {\if#1*\expandafter\gdef\csname#2\endcsname{\@ifnextchar[ {\array@memory{#1}{#2}}{\data@memory{#1}{#2}}}% \else \expandafter\def\csname#2\endcsname{\@ifnextchar[ {\array@memory{#1}{#2}}{\data@memory{#1}{#2}}}\fi} {\PackageWarningNoLine{memory}{`#2' already defined. Macro `newdata' ignored!}}} \def\newdata{\@ifnextchar*{\newdata@memory}{\newdata@memory{}}} % \Finale \endinput