Graphics, Figures & TablesMacros or Environment for configurable Table

Information and discussion about graphics, figures & tables in LaTeX documents.
Post Reply
migf
Posts: 20
Joined: Mon Feb 18, 2013 2:33 pm

Macros or Environment for configurable Table

Post by migf »

Hello,

I would appreciate help in solving the following problem.
I have this source:

Code: Select all

\begin{myenv}
\myitem{item1}
\myitem{item2}
...
\end{myenv}
and I would like to define myenv so that a table with a configurable number of columns is set up and filled with the items in the argument to \myitem commands. I tried this:

Code: Select all

\newcounter{ncols}
\setcounter{ncols}{5}  % number of columns (<8 see below)

\newcounter{itsinline} % number of items in current line

\newenvironment{myenv}{
\begin{tabular}{llllllll} 
 % all my attempts to make the cols depend on ncols failed...
}{
\end{tabular}
}

\newcommand{\myitem}[1]{\mysep{} #1}
where \mysep uses and adjusts the itsinline counter and expands to empty if the counter is 0, to & if it is less than ncols and to \\ if it is ncols. I defined it like this:

Code: Select all

\newcommand{\mysep}{\ifthenelse{\value{itsinl}=0}{%
\protect\setcounter{itsinl}{1}}{%
\ifthenelse{\value{itsinl}<\value{ncols}}{%
\protect\stepcounter{itsinl}&}{%
\protect\setcounter{itsinl}{0}\\
}}}
I keep getting a "Extra }, or forgotten \endgroup" message that I tried to avoid with \protect commands to no avail. The message is in the second item line and so corresponds to the "then" branch of the second \ifthenelse. Inserting a \protect before the & has no effect, so it seems it is impossible to expand & from a macro.

If I replace & by a space, the error is now on the 5th item, so on the last "else" branch. Inserting a \protect before the \\ does not work.

Is there any way of making this work, or is there some other solution to my initial problem?

Thanks in advance for any help.
Last edited by localghost on Mon Feb 18, 2013 6:25 pm, edited 1 time in total.

Recommended reading 2024:

LaTeXguide.org • LaTeX-Cookbook.net • TikZ.org

NEW: TikZ book now 40% off at Amazon.com for a short time.

And: Currently, Packt sells ebooks for $4.99 each if you buy 5 of their over 1000 ebooks. If you choose only a single one, $9.99. How about combining 3 LaTeX books with Python, gnuplot, mathplotlib, Matlab, ChatGPT or other AI books? Epub and PDF. Bundle (3 books, add more for higher discount): https://packt.link/MDH5p

cgnieder
Site Moderator
Posts: 2000
Joined: Sat Apr 16, 2011 7:27 pm

Macros or Environment for configurable Table

Post by cgnieder »

Hi migf,

welcome to the LaTeX community!

If I understood you correctly the code below should do what you want. I added some comments that hopefully explain how everything works:

Code: Select all

\documentclass{article}
% always useful when handling tables:
\usepackage{array}
% useful programming macros, e.g. list handling, number comparison...:
\usepackage{etoolbox}

% make @ a letter so it can be used in command names:
\makeatletter
\newcounter{ncols}
\newcounter{mytab@tmp}
\newenvironment{mytabular}[1][\arabic{ncols}]{%
% at the beginning of the environment:
  % `\tabitem', only defined inside the environment,
  % adds the items to a list:
  \def\tabitem##1{\listadd{\mytab@items}{##1}}%
  % if the number of columns is set to 0 or less use one column:
  \ifnumless{#1}{1}
    {\def\mytab@ncols{1}}
    {\def\mytab@ncols{#1}}%
  % initiate temporary counter:
  \setcounter{mytab@tmp}{1}%
}{%
% at the end of the environment:
  % `\mytab@handler' is the list handler:
  \def\mytab@handler##1##2{%
    % typeset the item:
    ##2%
    % if there are columns left add `&' and step the counter
    % else add `\\' and reset the counter:
    \ifnumless{\value{mytab@tmp}}{##1}
      {\stepcounter{mytab@tmp}&}
      {\setcounter{mytab@tmp}{1}\\}%
  }%
  \begin{tabular}{*{\mytab@ncols}{l}}
   \forlistloop{\mytab@handler{\mytab@ncols}}{\mytab@items}
  \end{tabular}%
}
% make @ other again:
\makeatother

\begin{document}
\setcounter{ncols}{5}
\begin{mytabular}
 \tabitem{one}
 \tabitem{two}
 \tabitem{three}
 \tabitem{four}
 \tabitem{five}
 \tabitem{six}
 \tabitem{seven}
\end{mytabular}

\bigskip

\begin{mytabular}[3]
 \tabitem{one}
 \tabitem{two}
 \tabitem{three}
 \tabitem{four}
 \tabitem{five}
 \tabitem{six}
 \tabitem{seven}
\end{mytabular}

\bigskip

\begin{mytabular}[8]
 \tabitem{one}
 \tabitem{two}
 \tabitem{three}
 \tabitem{four}
 \tabitem{five}
 \tabitem{six}
 \tabitem{seven}
\end{mytabular}

\end{document}​
Regards
site moderator & package author
migf
Posts: 20
Joined: Mon Feb 18, 2013 2:33 pm

Re: Macros or Environment for configurable Table

Post by migf »

Hi Clemens,

Thanks a lot! I just processed your text and it works as I need. I will look at it in detail later to try to learn some of the tricks you used and that are quite new to me.

Regards,
Miguel
migf
Posts: 20
Joined: Mon Feb 18, 2013 2:33 pm

Macros or Environment for configurable Table

Post by migf »

Hello again,

I am trying to change the solution Clemens kindly provided in answer to my first post. There are two changes I need to do: using a longtable environment instead of a tabular one, and making possible to draw horizontal lines, as done with \hlines in the standard environments. The former was easy to do, but in the latter I could not make out how to avoid "Misplaced \noalign" errors in the particular situation of \hline commands at the beginning of a line.

To generate a hline I added a new local command \myhline that adds a special item my@hline to the list of items. Maybe there is a better name to use here in order to make sure this is not a user item: any suggestion?. This special item is later on dealt with by the items handler as follows: if the current line is empty (the items counter is 1) issue a \hline, otherwise reset the items counter to 1 and issue \\\hline. The errors I got are for the first case and I really cannot make out what is going on.

There is also an issue concerning the embedding of environments in this environment. The solution I have defines the items list globally and at the beginning of the environment the list is reset to undefined. This clearly does not allow for this environment to be embedded in itself. A proper solution would be to save any existing list and restore it at the end, but I am not confident enough to try coding that.

Here is the current state of the code with changes by me marked with comments starting by %%M:

Code: Select all

\documentclass{article}
% always useful when handling tables:
\usepackage{array}
% useful programming macros, e.g. list handling, number comparison...:
\usepackage{etoolbox}
%%M tables may extend to next pages:
\usepackage{longtable}

% make @ a letter so it can be used in command names:
\makeatletter
\newcounter{ncols}
\newcounter{mytab@tmp}
%%M changed the environment name from mytabular to mylongtable
\newenvironment{mylongtable}[1][\arabic{ncols}]{%
% at the beginning of the environment:
  %%M in order to have embedded environments (but not mylongtable)
  %% the list of items must be set globally and undefined here
  \let\mytab@items\un@defined%
  % `\tabitem', only defined inside the environment,
  % adds the items to a list:
  %%M using \listgadd instead of \listadd
  \def\tabitem##1{\listgadd{\mytab@items}{##1}}%
  %%M '\myhline' adds a special item my@hline to the items list
  \def\myhline{\tabitem{my@hline}}%
Up to here I changed the environment name, reset the items list to undefined, replaced \listadd by \listgadd, and defined \myhline that uses \tabitem to add a special item to the items list.

There are no other changes in the code for the beginning of the environment. In the code for the end of the environment the items handler was changed as described above, and the tabular was replaced by longtable:

Code: Select all

  % if the number of columns is set to 0 or less use one column:
  \ifnumless{#1}{1}
    {\def\mytab@ncols{1}}
    {\def\mytab@ncols{#1}}%
  % initiate temporary counter:
  \setcounter{mytab@tmp}{1}%
}{%
% at the end of the environment:
  % `\mytab@handler' is the list handler:
    %%M process my@hline items (original code in the else part)
    \ifstrequal{my@hline}{##2}{%
      %%M end current line if not empty and draw line
      \ifnumequal{\value{mytab@tmp}}{1}{\hline}{%
        \setcounter{mytab@tmp}{1}\\\hline}}{%
      % typeset the item:
      ##2%
      % if there are columns left add `&' and step the counter
      % else add `\\' and reset the counter:
      \ifnumless{\value{mytab@tmp}}{##1}
        {\stepcounter{mytab@tmp}&}
        {\setcounter{mytab@tmp}{1}\\}%
      }%
  }%
  %%M using longtable instead of tabular
  \begin{longtable}{*{\mytab@ncols}{l}}
   \forlistloop{\mytab@handler{\mytab@ncols}}{\mytab@items}
  \end{longtable}%
}
% make @ other again:
\makeatother

\begin{document}
\setcounter{ncols}{5}
\begin{mylongtable}
%\myhline        % yields an ! Misplaced \noalign error
%\myhline        % yields an ! Misplaced \noalign error
 \tabitem{one}
 \tabitem{two}
 \tabitem{three}\myhline % this one works (position 3)
 \tabitem{four}
 \tabitem{five}
 \tabitem{six}
 \tabitem{seven}
 \tabitem{eigth}%\myhline % at end of line: yields error
 \tabitem{nine}
 \tabitem{ten}
 \tabitem{eleven}
\end{mylongtable}

\bigskip

\begin{mylongtable}[3]
 \tabitem{one}
 \tabitem{two}
 \tabitem{three}
 \tabitem{four}
 \tabitem{five}
 \tabitem{six}
 \tabitem{seven}\myhline
 \tabitem{one}
 \tabitem{two}
 \tabitem{three}
 \tabitem{four}
 \tabitem{five}
 \tabitem{six}
 \tabitem{seven}\myhline
 \tabitem{one}
 \tabitem{two}
 \tabitem{three}
 \tabitem{four}
 \tabitem{five}
 \tabitem{six}
 \tabitem{seven}\myhline
 \tabitem{one}
 \tabitem{two}
 \tabitem{three}
 \tabitem{four}
 \tabitem{five}
 \tabitem{six}

 \tabitem{seven}\myhline
 \tabitem{one}
 \tabitem{two}
 \tabitem{three}
 \tabitem{four}
 \tabitem{five}
 \tabitem{six}
 \tabitem{seven}\myhline
 \tabitem{one}
 \tabitem{two}
 \tabitem{three}
 \tabitem{four}
 \tabitem{five}
 \tabitem{six}
 \tabitem{seven}\myhline
 \tabitem{one}
 \tabitem{two}
 \tabitem{three}
 \tabitem{four}
 \tabitem{five}
 \tabitem{six}
 \tabitem{seven}\myhline
 \tabitem{one}
 \tabitem{two}
 \tabitem{three}
 \tabitem{four}
 \tabitem{five}
 \tabitem{six}
 \tabitem{seven}\myhline
 \tabitem{one}
 \tabitem{two}
 \tabitem{three}
 \tabitem{four}
 \tabitem{five}
 \tabitem{six}
 \tabitem{seven}\myhline
 \tabitem{one}
 \tabitem{two}
 \tabitem{three}
 \tabitem{four}
 \tabitem{five}
 \tabitem{six}
 \tabitem{seven}\myhline
 \tabitem{one}
 \tabitem{two}
 \tabitem{three}
 \tabitem{four}
 \tabitem{five}
 \tabitem{six}
 \tabitem{seven}\myhline
 \tabitem{one}
 \tabitem{two}
 \tabitem{three}
 \tabitem{four}
 \tabitem{five}
 \tabitem{six}
 \tabitem{seven}\myhline
 \tabitem{one}
 \tabitem{two}
 \tabitem{three}
 \tabitem{four}
 \tabitem{five}
 \tabitem{six}
 \tabitem{seven}\myhline
 \tabitem{one}
 \tabitem{two}
 \tabitem{three}
 \tabitem{four}
 \tabitem{five}
 \tabitem{six}
 \tabitem{seven}\myhline
 \tabitem{one}
 \tabitem{two}
 \tabitem{three}
 \tabitem{four}
 \tabitem{five}
 \tabitem{six}
 \tabitem{seven}\myhline
 \tabitem{one}
 \tabitem{two}
 \tabitem{three}
 \tabitem{four}
 \tabitem{five}
 \tabitem{six}
 \tabitem{seven}\myhline
 \tabitem{one}
 \tabitem{two}
 \tabitem{three}
 \tabitem{four}
 \tabitem{five}
 \tabitem{six}
 \tabitem{seven}\myhline
 \tabitem{one}
 \tabitem{two}
 \tabitem{three}
 \tabitem{four}
 \tabitem{five}
 \tabitem{six}
 \tabitem{seven}\myhline
 \tabitem{one}
 \tabitem{two}
 \tabitem{three}
 \tabitem{four}
 \tabitem{five}
 \tabitem{six}
 \tabitem{seven}\myhline
 \tabitem{one}
 \tabitem{two}
 \tabitem{three}
 \tabitem{four}
 \tabitem{five}
 \tabitem{six}
 \tabitem{seven}\myhline
 \tabitem{one}
 \tabitem{two}
 \tabitem{three}
 \tabitem{four}
 \tabitem{five}
 \tabitem{six}
 \tabitem{seven}\myhline
\end{mylongtable}

\end{document}
The body of the document has a first table with some \myhline commands commented out because they cause errors. The second table is a long one. Changing its number of columns will in some cases cause errors because of the \myhline commands getting to the beginning of lines.

Thanks in advance for any help on this.

Regards,
Miguel
User avatar
cgnieder
Site Moderator
Posts: 2000
Joined: Sat Apr 16, 2011 7:27 pm

Macros or Environment for configurable Table

Post by cgnieder »

First of all: I have some code that works. I'll post it below. The main problem of placing the \hline is that it must be the first thing of a new tabular line, i.e. after \\. This means any code inside the table between \\ and \hline must be expandable and must not typeset anything. After trying a few things I convinced myself that another strategy is best: test the different list items what they contain and build a macro containing the table elements depending on the items. Afterwards the table is typeset.

Since TeX programming is much easier with »expl3« (the LaTeX3 programming layer) I used it for the task. Probably the code is not the most efficient one. Feel free to improve it.

Regards

Code: Select all

\documentclass{article}

\usepackage{longtable}
\usepackage{expl3,xparse}

\ExplSyntaxOn
% define variables:
\seq_new:N  \l__dyntable_items_seq

\int_new:N  \g__dyntable_tmp_int
\int_new:N  \l__dyntable_columns_int
\int_new:N  \l__dyntable_items_int

\tl_new:N   \l__dyntable_tmp_tl
\tl_new:N   \l__dyntable_table_tl

\bool_new:N \l__dyntable_start_with_line_bool
\bool_new:N \l__dyntable_end_with_line_bool
\bool_new:N \g__dyntable_end_of_line_bool
\bool_new:N \g__dyntable_hline_bool
\bool_new:N \g__dyntable_hline_set_bool

% default number of columns:
\int_set:Nn \l__dyntable_columns_int { 3 }

% add and count items:
\cs_new:Npn \dyntable_item:n #1
  {
    \seq_put_right:Nn \l__dyntable_items_seq { #1 }
    \int_incr:N \l__dyntable_items_int
  }

% add hline flag:
\cs_new:Npn \dyntable_hline:
  { \seq_put_right:Nn \l__dyntable_items_seq { :::hline::: } }

% build the table:
\cs_new:Npn \dyntable_build_table:n #1
  { \tl_put_right:Nn \l__dyntable_table_tl { #1 } }

% at the beginning of the environment:
\cs_new:Npn \dyntable_begin_env:
  {
    % if number of columns less than one use one:
    \int_compare:nT { \l__dyntable_columns_int < 1 }
      { \int_set:Nn \l__dyntable_columns_int { 1 } }
    % make internal macros accessable:
    \cs_set_eq:NN \tabitem \dyntable_item:n
    \cs_set_eq:NN \tabline \dyntable_hline:
  }

% at the end of the environment:
\cs_new:Npn \dyntable_end_env:
  {
    % if less items than columns:
    \int_compare:nT { \l__dyntable_items_int < \l__dyntable_columns_int }
      { \int_set_eq:NN \l__dyntable_columns_int \l__dyntable_items_int }
    % does the table start with a line?
    \seq_get_left:NN \l__dyntable_items_seq \l__dyntable_tmp_tl
    \tl_if_eq:VnT \l__dyntable_tmp_tl { :::hline::: }
      {
        \bool_set_true:N \l__dyntable_start_with_line_bool
        \seq_pop_left:NN \l__dyntable_items_seq \l__dyntable_tmp_tl
      }
    % does it end with a line?
    \seq_get_right:NN \l__dyntable_items_seq \l__dyntable_tmp_tl
    \tl_if_eq:VnT \l__dyntable_tmp_tl { :::hline::: }
      {
        \bool_set_true:N \l__dyntable_end_with_line_bool
        \seq_pop_right:NN \l__dyntable_items_seq \l__dyntable_tmp_tl
      }
    % build the table:
    \int_gzero:N \g__dyntable_tmp_int
    \dyntable_build_table:n
      { \begin{longtable}{*{\l__dyntable_columns_int}{l}} }
    % if we omit the \\ here every table starting with a line will give a
    % ``underfull \vbox'' message
    % if we use it an empty line will be the first line of each table, though
    % which may be the last line on a page...:
    \bool_if:NT \l__dyntable_start_with_line_bool
      { \dyntable_build_table:n { \\\hline } }
    % map through sequence of table items:
    \seq_map_inline:Nn \l__dyntable_items_seq
      {
        % if line flag
        \tl_if_eq:nnTF { :::hline::: } { ##1 }
          {
            % at end of line use \hline else set boolean:
            \bool_if:NTF \g__dyntable_end_of_line_bool
              { \dyntable_build_table:n { \hline } }
              { \bool_gset_true:N \g__dyntable_hline_bool }
          }
          {
            \int_compare:nTF
              { \g__dyntable_tmp_int + 1 < \l__dyntable_columns_int }
              {
                \int_gincr:N \g__dyntable_tmp_int
                \bool_gset_false:N \g__dyntable_end_of_line_bool
                \bool_gset_false:N \g__dyntable_hline_set_bool
                \dyntable_build_table:n { ##1 & }
              }
              {
                \int_gzero:N \g__dyntable_tmp_int
                \bool_gset_true:N \g__dyntable_end_of_line_bool
                \bool_if:NTF \g__dyntable_hline_bool
                  {
                    \bool_gset_false:N \g__dyntable_hline_bool
                    \bool_gset_true:N \g__dyntable_hline_set_bool
                    \dyntable_build_table:n { ##1 \\ \hline }
                  }
                  {
                    \bool_gset_false:N \g__dyntable_hline_set_bool
                    \dyntable_build_table:n { ##1 \\ }
                  }
              }
          }
      }
    \bool_if:nT
      { \l__dyntable_end_with_line_bool && !\g__dyntable_hline_set_bool }
      {
        \bool_if:NTF \g__dyntable_end_of_line_bool
          { \dyntable_build_table:n { \hline } }
          { \dyntable_build_table:n { \\\hline } }
      }
    \dyntable_build_table:n { \end{longtable} }
    % typeset table:
    \tl_use:N \l__dyntable_table_tl
  }
% a variant of a kernel command that we need in the above code
% but isn't provided by the kernel:
\cs_generate_variant:Nn \tl_if_eq:nnT { V }

% the user interface:
\NewDocumentEnvironment{dyntable}{o}
  {
    % if optional argument:
    \IfNoValueF { #1 }
      { \int_set:Nn \l__dyntable_columns_int { #1 } }
    \dyntable_begin_env:
  }
  { \dyntable_end_env: }
\ExplSyntaxOff

\begin{document}

\begin{dyntable}[1]
 \tabline
  \tabitem{one}
  \tabitem{two}
  \tabitem{three}
  \tabitem{four}
 \tabline
  \tabitem{five}
  \tabitem{six}
  \tabitem{seven}
  \tabitem{eight}
  \tabitem{nine}
  \tabitem{ten}
 \tabline
\end{dyntable}

\begin{dyntable}[2]
 \tabline
  \tabitem{one}
  \tabitem{two}
  \tabitem{three}
  \tabitem{four}
 \tabline
  \tabitem{five}
  \tabitem{six}
  \tabitem{seven}
  \tabitem{eight}
  \tabitem{nine}
  \tabitem{ten}
 \tabline
\end{dyntable}

\begin{dyntable}[3]% = default
 \tabline
  \tabitem{one}
  \tabitem{two}
  \tabitem{three}
  \tabitem{four}
 \tabline
  \tabitem{five}
  \tabitem{six}
  \tabitem{seven}
  \tabitem{eight}
  \tabitem{nine}
  \tabitem{ten}
 \tabline
\end{dyntable}

\begin{dyntable}[4]
 \tabline
  \tabitem{one}
  \tabitem{two}
  \tabitem{three}
  \tabitem{four}
 \tabline
  \tabitem{five}
  \tabitem{six}
  \tabitem{seven}
  \tabitem{eight}
  \tabitem{nine}
  \tabitem{ten}
 \tabline
\end{dyntable}

\begin{dyntable}[5]
 \tabline
  \tabitem{one}
  \tabitem{two}
  \tabitem{three}
  \tabitem{four}
 \tabline
  \tabitem{five}
  \tabitem{six}
  \tabitem{seven}
  \tabitem{eight}
  \tabitem{nine}
  \tabitem{ten}
 \tabline
\end{dyntable}

\begin{dyntable}[6]
 \tabline
  \tabitem{one}
  \tabitem{two}
  \tabitem{three}
  \tabitem{four}
 \tabline
  \tabitem{five}
  \tabitem{six}
  \tabitem{seven}
  \tabitem{eight}
  \tabitem{nine}
  \tabitem{ten}
 \tabline
\end{dyntable}

\begin{dyntable}[7]
 \tabline
  \tabitem{one}
  \tabitem{two}
  \tabitem{three}
  \tabitem{four}
 \tabline
  \tabitem{five}
  \tabitem{six}
  \tabitem{seven}
  \tabitem{eight}
  \tabitem{nine}
  \tabitem{ten}
 \tabline
\end{dyntable}

\begin{dyntable}[8]
 \tabline
  \tabitem{one}
  \tabitem{two}
  \tabitem{three}
  \tabitem{four}
 \tabline
  \tabitem{five}
  \tabitem{six}
  \tabitem{seven}
  \tabitem{eight}
  \tabitem{nine}
  \tabitem{ten}
 \tabline
\end{dyntable}

\begin{dyntable}[9]
 \tabline
  \tabitem{one}
  \tabitem{two}
  \tabitem{three}
  \tabitem{four}
 \tabline
  \tabitem{five}
  \tabitem{six}
  \tabitem{seven}
  \tabitem{eight}
  \tabitem{nine}
  \tabitem{ten}
 \tabline
\end{dyntable}

\begin{dyntable}[10]
 \tabline
  \tabitem{one}
  \tabitem{two}
  \tabitem{three}
  \tabitem{four}
 \tabline
  \tabitem{five}
  \tabitem{six}
  \tabitem{seven}
  \tabitem{eight}
  \tabitem{nine}
  \tabitem{ten}
 \tabline
\end{dyntable}

\begin{dyntable}[11]
 \tabline
  \tabitem{one}
  \tabitem{two}
  \tabitem{three}
  \tabitem{four}
 \tabline
  \tabitem{five}
  \tabitem{six}
  \tabitem{seven}
  \tabitem{eight}
  \tabitem{nine}
  \tabitem{ten}
 \tabline
\end{dyntable}

\end{document}
site moderator & package author
migf
Posts: 20
Joined: Mon Feb 18, 2013 2:33 pm

Macros or Environment for configurable Table

Post by migf »

Hi Clemens,

Thanks for your reply! It is the first time I see LaTeX3 code so I am unable to try to improve your code. I tried to change the code in my last post by issuing an initial \hline together with the \begin{longtable} and by postponing the generation of \\s until after a normal item appears, so that other \hline's were prefixed with a \\. However this does not work when there are two or more \hline's in sequence. So I will use your solution.

Regards,
Miguel
User avatar
cgnieder
Site Moderator
Posts: 2000
Joined: Sat Apr 16, 2011 7:27 pm

Macros or Environment for configurable Table

Post by cgnieder »

You can read about »expl3« in interface3.pdf. It takes a while to get used to the syntax but once you're familiar with it it is a lot easier to read than traditional (La)TeX code. What's more: »expl3« provides lots and lots of handy macros resembling traditional programming functions. (In the end they're all still TeX macros of course...)

Regards
site moderator & package author
migf
Posts: 20
Joined: Mon Feb 18, 2013 2:33 pm

Macros or Environment for configurable Table

Post by migf »

cgnieder wrote:You can read about »expl3« in interface3.pdf
Thanks, I just downloaded it. I am working on some stuff in which this may be helpful.

Regards
User avatar
localghost
Site Moderator
Posts: 9202
Joined: Fri Feb 02, 2007 12:06 pm

Macros or Environment for configurable Table

Post by localghost »

migf wrote:Thanks, I just downloaded it. […]
No need to download. Assumed that the LaTeX3 related stuff is installed on your system, you have simple access via command line.

Code: Select all

texdoc interface3

Best regards and welcome to the board
Thorsten
Post Reply