% \iffalse %% File: l3toks.dtx Copyright (C) 1990-2006 LaTeX3 project %% %% It may be distributed and/or modified under the conditions of the %% LaTeX Project Public License (LPPL), either version 1.3c of this %% license or (at your option) any later version. The latest version %% of this license is in the file %% %% http://www.latex-project.org/lppl.txt %% %% This file is part of the ``expl3 bundle'' (The Work in LPPL) %% and all files in that bundle must be distributed together. %% %% The released version of this bundle is available from CTAN. %% %% ----------------------------------------------------------------------- %% %% The development version of the bundle can be found at %% %% http://www.latex-project.org/cgi-bin/cvsweb.cgi/ %% %% for those people who are interested. %% %%%%%%%%%%% %% NOTE: %% %%%%%%%%%%% %% %% Snapshots taken from the repository represent work in progress and may %% not work or may contain conflicting material! We therefore ask %% people _not_ to put them into distributions, archives, etc. without %% prior consultation with the LaTeX Project Team. %% %% ----------------------------------------------------------------------- % %<*driver|package> \RequirePackage{l3names} % %\fi \GetIdInfo$Id: l3toks.dtx 728 2008-01-01 16:11:58Z morten $ {L3 Experimental Token Registers} %\iffalse %<*driver> %\fi \ProvidesFile{\filename.\filenameext} [\filedate\space v\fileversion\space\filedescription] %\iffalse \documentclass{l3doc} \begin{document} \DocInput{\filename.\filenameext} \end{document} % % \fi % % % \title{The \textsf{l3toks} package\thanks{This file % has version number \fileversion, last % revised \filedate.}\\ % Token Registers} % \author{\Team} % \date{\filedate} % \maketitle % % \section {Token Registers} % % There is a second form beside token list pointers in which \LaTeX3 % stores token lists, namely the internal \TeX{} token registers. % Functions dealing with these registers got the prefix "\toks_". Unlike % token list pointers we have an accessing function as one can see % below. % % The main difference between \m{toks} (token registers) and \m{tlp} (token % list pointers) is their behavior regarding expansion. While \m{tlp}'s % expand fully (i.e., until only unexpandable tokens are left) inside % an argument that is subject to expansion (i.e., denote by |x|) % \m{toks}'s expand always only up to one level, i.e., passing their % contents without further expansion. % % \subsection{Functions} % % \begin{function}{% % \toks_new:N | % \toks_new:c | % \toks_new_l:N} % \begin{syntax} % "\toks_new:N" % \end{syntax} % Defines to be a new token list register. % \begin{texnote} % This is the \LaTeX3 allocation for what was called \tn{newtoks} in % plain \TeX. % \end{texnote} % \end{function} % % \begin{function}{% % \toks_set:Nn | % \toks_set:No | % \toks_set:Nd | % \toks_set:Nf | % \toks_set:Nx | % \toks_set:cn | % \toks_set:co | % \toks_set:cf | % \toks_set:cx | % \toks_gset:Nn | % \toks_gset:No | % \toks_gset:Nx} % \begin{syntax} % "\toks_set:Nn" "{""}" % \end{syntax} % Defines to hold the token list . Global % variants of this command assign the value globally the other variants % expand the up to a certain level before the assignment % or interpret the as a character list and form a control % sequence out of it. % \begin{texnote} % "\toks_set:Nn" could have been specified in plain \TeX{} by "=" % "{" "}" but all other functions have no counterpart in % plain \TeX. Additionally the functions above will check for correct % local and global assignments, something that isn't available in plain % \TeX. % \end{texnote} % \end{function} % % \begin{function}{% % \toks_gset_eq:NN | % } % \begin{syntax} % "\toks_gset_eq:NN" % \end{syntax} % The globally set to the value of . Don't try to use % "\toks_gset:Nn" for this purpose if the second argument is also a % token register. % \end{function} % % \begin{function}{% % \toks_clear:N | % \toks_gclear:N | % } % \begin{syntax} % "\toks_clear:N" % \end{syntax} % The is locally or globally cleared. % \end{function} % % \begin{function}{% % \toks_put_left:Nn | % \toks_gput_left:Nn | % \toks_put_right:Nn | % \toks_put_right:No | % \toks_put_right:Nx | % \toks_gput_right:Nn | % \toks_gput_right:No | % \toks_gput_right:Nx | % } % \begin{syntax} % "\toks_put_left:Nn" "{""}" % \end{syntax} % These functions will append to the left or right of % . Assignment is done either locally or globally. If possible % append to the right since this operation is faster. % \end{function} % % \begin{function}{\toks_use:N} % \begin{syntax} % "\toks_use:N" % \end{syntax} % Accesses the contents of . Contrary to token list pointers % can't be access simply by calling them directly. % \begin{texnote} % Something like \tn{the} . % \end{texnote} % \end{function} % % \begin{function}{\toks_use_clear:N | % \toks_use_gclear:N} % \begin{syntax} % "\toks_use_clear:N" % \end{syntax} % Accesses the contents of and clears (locally or globally) it % afterwards. Actually the clearing operation is done in a way that does % not prohibit the access of the following tokens in the input stream % with functions stored in the token register. In other words this % function is not exactly the same as calling "\toks_use:N" % "\toks_clear:N" in sequence. % \end{function} % % \subsection{Predicates and conditionals} % % \begin{function}{ % \toks_if_empty_p:N| % \toks_if_empty:NTF| % \toks_if_empty:NT | % \toks_if_empty:NF| % \toks_if_empty_p:c| % \toks_if_empty:cTF | % \toks_if_empty:cT | % \toks_if_empty:cF % } % \begin{syntax} % "\toks_if_empty:NTF" "{""}{""}" % \end{syntax} % Tests if is empty. % \end{function} % % \subsection{Variable and constants} % % \begin{variable}{\c_empty_toks} % Constant that is always empty. % \end{variable} % % \begin{variable}{% % \l_tmpa_toks | % \l_tmpb_toks | % \g_tmpa_toks | % \g_tmpb_toks % } % Scratch register for immediate use. They are not used by conditionals % or predicate functions. % \end{variable} % % \subsubsection{Internal functions} % % \begin{function}{\toks_put_left_aux:w} % Used by "\toks_put_left:Nn" and its variants. % \end{function} % % \begin{function}{\tex_toksdef:D} % Primitive function for defining a to correspond to a token % register should not be used by a programmer. % \begin{texnote} % This function was named \tn{toksdef}. % \end{texnote} % \end{function} % % \StopEventually{} % % \subsection{The Implementation} % % We start by ensuring that the required packages are loaded. % We check for \texttt{l3expan} since this a basic package that is % essential for use of any higher-level package. % \begin{macrocode} %\ProvidesExplPackage % {\filename}{\filedate}{\fileversion}{\filedescription} %\RequirePackage{l3chk}\par %\RequirePackage{l3expan}\par %<*initex|package> % \end{macrocode} % % \begin{macro}{\toks_new:N} % \begin{macro}{\toks_new_l:N} % \begin{macro}{\toks_new:c} % Allocates a new token register. This function is already defined above. % \begin{macrocode} %<*initex> \alloc_setup_type:nnn {toks} \c_zero \c_max_register_num \def_new:Npn \toks_new:N #1{\alloc_reg:NnNN g {toks} \tex_toksdef:D #1} \def_new:Npn \toks_new_l:N #1{\alloc_reg:NnNN l {toks} \tex_toksdef:D #1} % %\let:NN \toks_new:N \newtoks % nick from LaTeX for the moment \def_new:Npn \toks_new:c {\exp_args:Nc\toks_new:N} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\toks_clear:N} % \begin{macro}{\toks_gclear:N} % These functions clear a token register, either locally or globally. % \begin{macrocode} \def_new:Npn \toks_clear:N #1{#1\c_empty_toks %<*check> \chk_local_or_pref_global:N #1 % } \def_new:Npn \toks_gclear:N { %<*check> \pref_global_chk: % %<-check> \pref_global:D \toks_clear:N} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\toks_use:N} % \begin{macro}{\toks_use:c} % This function just returns the contents of a token register. % \begin{macrocode} \let_new:NN \toks_use:N \the_internal:D \def_new:Npn \toks_use:c {\exp_args:Nc\toks_use:N} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\toks_use_clear:N} % \begin{macro}{\toks_use_gclear:N} % These functions clear a token register (locally or globally) after % returning the contents. % % They make sure that clearing the register does not % interfere with following tokens. In other words, the contents of % the register might operate on what follows in the input stream. % A direct implementation will save one |\exp_after:NN| but for the % sake of checking we do it this way now. % \begin{macrocode} \def_new:Npn \toks_use_clear:N#1{ \exp_after:NN \toks_clear:N \exp_after:NN #1 \toks_use:N#1} \def_new:Npn \toks_use_gclear:N{ %<*check> \pref_global_chk: % %<-check> \pref_global:D \toks_use_clear:N} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\toks_put_left:Nn} % \begin{macro}{\toks_put_left:No} % \begin{macro}{\toks_gput_left:Nn} % \begin{macro}{\toks_gput_left:Nx} % \begin{macro}{\toks_put_left_aux:w} % |\toks_put_left:Nn |\zz{toks}\zv{stuff\/} adds the tokens of % \textsl{stuff} on the `left-side' of the token register % \m{toks}. |\toks_put_left:No| does the same, but expands the % tokens once. We need to look out for brace stripping so we add a % token, which is then later removed. % \begin{macrocode} \def_new:Npn \toks_put_left:Nn #1{ \exp_after:NN\toks_put_left_aux:w\exp_after:NN\q_mark \toks_use:N #1\q_stop #1} \def_new:Npn \toks_put_left:No {\exp_args:NNo \toks_put_left:Nn} \def_new:Npn \toks_gput_left:Nn { %<*check> \pref_global_chk: % %<-check> \pref_global:D \toks_put_left:Nn} \def_new:Npn \toks_gput_left:Nx {\exp_args:NNx \toks_gput_left:Nn} % \end{macrocode} % A helper function for |\toks_put_left:Nn|. Its arguments are % subsequently the tokens of \zv{stuff\/}, the token register % \zz{toks} and the current contents of \zz{toks}. We make sure to % remove the token we inserted earlier. % \begin{macrocode} \def_long_new:Npn \toks_put_left_aux:w #1\q_stop #2#3{ #2\exp_after:NN{\use_arg_i:nn{#3}#1} %<*check> \chk_local_or_pref_global:N #2 % } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\toks_put_right:Nn} % \begin{macro}{\toks_gput_right:Nn} % \begin{macro}{\toks_put_right:No} % \begin{macro}{\toks_put_right:Nd} % \begin{macro}{\toks_put_right:Nf} % \begin{macro}{\toks_put_right:Nx} % \begin{macro}{\toks_gput_right:No} % \begin{macro}{\toks_gput_right:Nx} % These macros add a list of tokens to the right of a token register. % \begin{macrocode} \def_long_new:Npn \toks_put_right:Nn #1#2{#1\exp_after:NN{\toks_use:N #1#2} %<*check> \chk_local_or_pref_global:N #1 % } \def_new:Npn \toks_gput_right:Nn { %<*check> \pref_global_chk: % %<-check> \pref_global:D \toks_put_right:Nn} % \end{macrocode} % |\toks_gput_right:Nx| expands its (second) argument. % \begin{macrocode} %\def_new:Npn \toks_put_right:No {\exp_args:NNo \toks_put_right:Nn } %<-check>\def_long_new:Npn\toks_put_right:No#1#2{#1\exp_after:NN\exp_after:NN %<-check>\exp_after:NN{\exp_after:NN\toks_use:N\exp_after:NN #1#2}} %\def_new:Npn \toks_put_right:Nd {\exp_args:NNd \toks_put_right:Nn } %<-check>\def_long_new:Npn\toks_put_right:Nd#1#2{ %<-check> \exp_after:NN\toks_put_right:No\exp_after:NN#1\exp_after:NN{#2}} % \end{macrocode} % We implement |\toks_put_right:Nf| by hand because I think I might % use it in the \textsf{l3keyval} module in which case it is going to % be used a lot. % \begin{macrocode} %\def_new:Npn \toks_put_right:Nf {\exp_args:NNf \toks_put_right:Nn } %<-check>\def_long_new:Npn \toks_put_right:Nf #1#2{ %<-check> #1\exp_after:NN\exp_after:NN\exp_after:NN{ %<-check> \exp_after:NN\toks_use:N\exp_after:NN #1\int_to_roman:w -`0#2}} \def_new:Npn \toks_put_right:Nx {\exp_args:NNx \toks_put_right:Nn } \def_new:Npn \toks_gput_right:No {\exp_args:NNo\toks_gput_right:Nn} \def_new:Npn \toks_gput_right:Nx {\exp_args:NNx\toks_gput_right:Nn} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\toks_set:Nn} % \begin{macro}{\toks_set:No} % \begin{macro}{\toks_set:Nd} % \begin{macro}{\toks_set:Nf} % \begin{macro}{\toks_set:Nx} % \begin{macro}{\toks_set:cn} % \begin{macro}{\toks_set:co} % \begin{macro}{\toks_set:cf} % \begin{macro}{\toks_set:cx} % |\toks_set:Nn|\m{toks}\m{stuff} stores \m{stuff} without expansion % in \m{toks}. |\toks_set:No| and |\toks_set:Nx| expand \m{stuff} once % and fully. % \begin{macrocode} %<*check> \def_new:Npn \toks_set:Nn #1{\chk_local:N #1#1} % % \end{macrocode} % If we don't check if \m{toks} is a local register then the % |\toks_set:Nn| function has nothing to do. % \begin{macrocode} %<-check> \let_new:NN \toks_set:Nn\use_noop: %<-check> \def_long_new:Npn \toks_set:No#1#2{#1\exp_after:NN{#2}} %<-check> \def_long_new:Npn \toks_set:Nd#1#2{ %<-check> #1\exp_after:NN\exp_after:NN\exp_after:NN{#2}} % \def_new:Npn \toks_set:No {\exp_args:NNo \toks_set:Nn} % \def_new:Npn \toks_set:Nd {\exp_args:NNd \toks_set:Nn} \def_new:Npn \toks_set:Nx {\exp_args:NNx \toks_set:Nn} % \end{macrocode} % We implement |\toks_set:Nf| by hand when not checking because this % is going to be used \emph{extensively} in keyval processing! % \begin{macrocode} %\def_new:Npn \toks_set:Nf {\exp_args:NNf \toks_set:Nn} %<-check>\def_long_new:Npn\toks_set:Nf #1#2{ %<-check> #1\exp_after:NN{\int_to_roman:w -`0#2}} \def_new:Npn \toks_set:cf {\exp_args:Nc\toks_set:Nf} \def_new:Npn \toks_set:cn {\exp_args:Nc\toks_set:Nn} \def_new:Npn \toks_set:co {\exp_args:Nc\toks_set:No} \def_new:Npn \toks_set:cx {\exp_args:Nc\toks_set:Nx} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\toks_gset:Nn} % \begin{macro}{\toks_gset:No} % \begin{macro}{\toks_gset:Nx} % \begin{macro}{\toks_gset:cn} % \begin{macro}{\toks_gset:co} % \begin{macro}{\toks_gset:cx} % These functions are the global variants of the above. % \begin{macrocode} %<*check> \def_new:Npn \toks_gset:Nn #1{\chk_global:N #1\pref_global:D#1} % %<-check> \let_new:NN \toks_gset:Nn\pref_global:D \def_new:Npn \toks_gset:No {\exp_args:NNo \toks_gset:Nn} \def_new:Npn \toks_gset:Nx {\exp_args:NNx \toks_gset:Nn} \def_new:Npn \toks_gset:cn {\exp_args:Nc \toks_gset:Nn} \def_new:Npn \toks_gset:co {\exp_args:Nc \toks_gset:No} \def_new:Npn \toks_gset:cx {\exp_args:Nc \toks_gset:Nx} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\toks_set_eq:NN} % \begin{macro}{\toks_set_eq:Nc} % \begin{macro}{\toks_set_eq:cN} % \begin{macro}{\toks_set_eq:cc} % \begin{macro}{\toks_gset_eq:NN} % \begin{macro}{\toks_gset_eq:Nc} % \begin{macro}{\toks_gset_eq:cN} % \begin{macro}{\toks_gset_eq:cc} % |\toks_set_eq:NN|\m{toks1}\m{toks2} copies the contents of \m{toks2} % in \m{toks1}. % \begin{macrocode} %<*check> \def_new:Npn\toks_set_eq:NN#1#2{ \chk_local:N#1 \chk_var_or_const:N#2 #1#2} \def_new:Npn\toks_gset_eq:NN#1#2{ \chk_global:N#1 \chk_var_or_const:N#2 \pref_global:D#1#2} % %<-check> \let_new:NN \toks_set_eq:NN \use_noop: %<-check> \let_new:NN \toks_gset_eq:NN \pref_global:D \def_new:Npn \toks_set_eq:Nc {\exp_args:NNc\toks_set_eq:NN} \def_new:Npn \toks_set_eq:cN {\exp_args:Nc\toks_set_eq:NN} \def_new:Npn \toks_set_eq:cc {\exp_args:Ncc\toks_set_eq:NN} \def_new:Npn \toks_gset_eq:Nc {\exp_args:NNc\toks_gset_eq:NN} \def_new:Npn \toks_gset_eq:cN {\exp_args:Nc\toks_gset_eq:NN} \def_new:Npn \toks_gset_eq:cc {\exp_args:Ncc\toks_gset_eq:NN} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\toks_if_empty_p:N} % \begin{macro}{\toks_if_empty_p:c} % \begin{macro}{\toks_if_empty:NTF} % \begin{macro}{\toks_if_empty:cTF} % \begin{macro}{\toks_if_empty:NT} % \begin{macro}{\toks_if_empty:cT} % \begin{macro}{\toks_if_empty:NF} % \begin{macro}{\toks_if_empty:cF} % |\toks_if_empty:NTF|\m{toks}\m{true code}\m{false code} tests if a % token register is empty and executes either \m{true code} or % \m{false code}. This test had the advantage of being % expandable. Otherwise one has to do an |x| type expansion in order % to prevent problems with parameter tokens. % \begin{macrocode} \def_new:Npn\toks_if_empty_p:N#1{ \if:w \tlist_if_empty_p:o{\toks_use:N #1} \c_true \else: \c_false \fi: } \def_test_function_new:npn{toks_if_empty:N}#1{\if:w \toks_if_empty_p:N #1} \def_new:Npn\toks_if_empty:cTF{\exp_args:Nc\toks_if_empty:NTF} \def_new:Npn\toks_if_empty:cT{\exp_args:Nc\toks_if_empty:NT} \def_new:Npn\toks_if_empty:cF{\exp_args:Nc\toks_if_empty:NF} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\toks_if_eq:NNTF} % \begin{macro}{\toks_if_eq:NNT} % \begin{macro}{\toks_if_eq:NNF} % \begin{macro}{\toks_if_eq:NcTF} % \begin{macro}{\toks_if_eq:NcT} % \begin{macro}{\toks_if_eq:NcF} % \begin{macro}{\toks_if_eq:cNTF} % \begin{macro}{\toks_if_eq:cNT} % \begin{macro}{\toks_if_eq:cNF} % \begin{macro}{\toks_if_eq:ccTF} % \begin{macro}{\toks_if_eq:ccT} % \begin{macro}{\toks_if_eq:ccF} % \begin{macro}{\toks_if_eq_p:NN} % \begin{macro}{\toks_if_eq_p:cN} % \begin{macro}{\toks_if_eq_p:Nc} % \begin{macro}{\toks_if_eq_p:cc} % This function test whether two token registers contain the same. % \begin{macrocode} \def_new:NNn \toks_if_eq:NNTF 2 { \tlist_if_eq:xxTF{\toks_use:N #1}{\toks_use:N #2} } \def_new:NNn \toks_if_eq:NNT 2 { \tlist_if_eq:xxT{\toks_use:N #1}{\toks_use:N #2} } \def_new:NNn \toks_if_eq:NNF 2 { \tlist_if_eq:xxF{\toks_use:N #1}{\toks_use:N #2} } \def_new:Npn \toks_if_eq:NcTF {\exp_args:NNc \toks_if_eq:NNTF} \def_new:Npn \toks_if_eq:NcT {\exp_args:NNc \toks_if_eq:NNT} \def_new:Npn \toks_if_eq:NcF {\exp_args:NNc \toks_if_eq:NNF} \def_new:Npn \toks_if_eq:cNTF {\exp_args:Nc \toks_if_eq:NNTF} \def_new:Npn \toks_if_eq:cNT {\exp_args:Nc \toks_if_eq:NNT} \def_new:Npn \toks_if_eq:cNF {\exp_args:Nc \toks_if_eq:NNF} \def_new:Npn \toks_if_eq:ccTF {\exp_args:Ncc \toks_if_eq:NNTF} \def_new:Npn \toks_if_eq:ccT {\exp_args:Ncc \toks_if_eq:NNT} \def_new:Npn \toks_if_eq:ccF {\exp_args:Ncc \toks_if_eq:NNF} \def_new:NNn \toks_if_eq_p:NN 2 { \tlist_if_eq_p:xx {\toks_use:N #1} {\toks_use:N #2} } \def_new:Npn \toks_if_eq_p:cN {\exp_args:Nc \toks_if_eq_p:NN} \def_new:Npn \toks_if_eq_p:Nc {\exp_args:NNc \toks_if_eq_p:NN} \def_new:Npn \toks_if_eq_p:cc {\exp_args:Ncc \toks_if_eq_p:NN} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\l_tmpa_toks} % \begin{macro}{\l_tmpb_toks} % \begin{macro}{\l_tmpc_toks} % \begin{macro}{\g_tmpa_toks} % \begin{macro}{\g_tmpb_toks} % \begin{macro}{\g_tmpc_toks} % Some scratch register \ldots % \begin{macrocode} \tex_toksdef:D \l_tmpa_toks = 255 %\seq_put_right:Nn \g_toks_allocation_seq {255} \toks_new:N \l_tmpb_toks \toks_new:N \l_tmpc_toks \toks_new:N \g_tmpa_toks \toks_new:N \g_tmpb_toks \toks_new:N \g_tmpc_toks % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\c_empty_toks} % And here is a constant, which is a (permanently) empty token register. % \begin{macrocode} \toks_new:N \c_empty_toks % \end{macrocode} % \end{macro} % % \begin{macro}{\toks_remove_extra_brace_group:N} % \begin{macro}{\toks_remove_extra_brace_group_aux:NNw} % Small function for removing an extra brace group if present. Hmm, % not really needed anymore. % \begin{macrocode} \def_new:Npn \toks_remove_extra_brace_group:N #1{ \exp_after:NN \toks_remove_extra_brace_group_aux:NNw \exp_after:NN \toks_set:Nn \exp_after:NN #1 \toks_use:N#1\q_nil } \def_long_new:Npn\toks_remove_extra_brace_group_aux:NNw #1#2#3\q_nil{#1#2{#3}} % \end{macrocode} % \end{macro} % \end{macro} % % Show token usage: % \begin{macrocode} % %<*showmemory> \showMemUsage % % \end{macrocode} % % \endinput % % $Log$ % Revision 1.25 2006/08/01 01:54:12 morten % Prevent brace stripping in \toks_put_left:Nn and friends. % % Revision 1.24 2006/03/20 18:26:40 braams % Updated the copyright notice (2006) and demoted all implementation % sections to subsections and so on to clean up the toc for source3.tex % % Revision 1.23 2006/02/16 23:32:49 braams % Imported \toks_put_left:No from l3messages % % Revision 1.22 2006/01/21 11:43:20 morten % Tuned some of the \toks_set and \toks_put_right functions since they % are going to be used intensively in the l3keyval module which is again % going to be heavily used. % % Revision 1.21 2006/01/20 12:22:44 morten % Minor changes plus added \toks_remove_extra_brace_group:N for l3keyval % module % % Revision 1.20 2005/12/27 10:03:39 morten % Changed RCS information retrieval % % Revision 1.19 2005/12/23 13:24:39 morten % Added a few functions from template % % Revision 1.18 2005/12/21 20:44:04 morten % Corrected typo. % % Revision 1.17 2005/12/02 15:56:48 morten % Added some more functions and improved test for emptiness. % % Revision 1.16 2005/04/12 13:22:37 morten % More functions added % % Revision 1.15 2005/04/07 08:18:17 morten % Only put 255 in the toks stack when running initex % % Revision 1.14 2005/04/06 22:35:50 braams % Now we have register allocation fitted % % Revision 1.13 2005/04/06 21:37:50 morten % Added some more functions % % Revision 1.12 2005/03/15 23:39:21 braams % Some fiddling to get it loaded by initex; needs a way to allocate % token registers for it to work. % % Revision 1.11 2005/03/11 21:25:06 braams % Changed copyright year, fixed use of RCS values; % fixed a few typos in the documentation; % \c_if_empty_toks had to be \c_empty_toks %