How to repeat the same content in different tables?











up vote
3
down vote

favorite












I have a list of keywords and descriptions for those keywords. I would like to have tables for the different contexts in which these are used, containing only the relevant ones for the case. Some of these keywords repeat on the different contexts, so it would be ideal to write the description only once and then "reference" that description in each of my tables for ease of maintenance.



Example:



section{Runtype 1 description}
begin{table}
begin{center}
begin{tabular}{ l l }
runtype & Keyword to determine runtype. Can be 1 or 2. \
& I don't want to hardcode this description twice...\
param_1 & Keyword to determine the parameter of runtype = 1 \
end{tabular}
end{center}
end{table}

section{Runtype 2 description}
begin{table}
begin{center}
begin{tabular}{ l l }
runtype & Keyword to determine runtype. Can be 1 or 2. \
& I don't want to hardcode this description twice...\
param_2 & Keyword to determine the parameter of runtype = 2 \
end{tabular}
end{center}
end{table}









share|improve this question







New contributor




Nordico is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
















  • 1




    Welcome to TeX.SE!
    – Kurt
    Nov 27 at 21:11










  • @Kurt Thank you!
    – Nordico
    Nov 27 at 21:41















up vote
3
down vote

favorite












I have a list of keywords and descriptions for those keywords. I would like to have tables for the different contexts in which these are used, containing only the relevant ones for the case. Some of these keywords repeat on the different contexts, so it would be ideal to write the description only once and then "reference" that description in each of my tables for ease of maintenance.



Example:



section{Runtype 1 description}
begin{table}
begin{center}
begin{tabular}{ l l }
runtype & Keyword to determine runtype. Can be 1 or 2. \
& I don't want to hardcode this description twice...\
param_1 & Keyword to determine the parameter of runtype = 1 \
end{tabular}
end{center}
end{table}

section{Runtype 2 description}
begin{table}
begin{center}
begin{tabular}{ l l }
runtype & Keyword to determine runtype. Can be 1 or 2. \
& I don't want to hardcode this description twice...\
param_2 & Keyword to determine the parameter of runtype = 2 \
end{tabular}
end{center}
end{table}









share|improve this question







New contributor




Nordico is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
















  • 1




    Welcome to TeX.SE!
    – Kurt
    Nov 27 at 21:11










  • @Kurt Thank you!
    – Nordico
    Nov 27 at 21:41













up vote
3
down vote

favorite









up vote
3
down vote

favorite











I have a list of keywords and descriptions for those keywords. I would like to have tables for the different contexts in which these are used, containing only the relevant ones for the case. Some of these keywords repeat on the different contexts, so it would be ideal to write the description only once and then "reference" that description in each of my tables for ease of maintenance.



Example:



section{Runtype 1 description}
begin{table}
begin{center}
begin{tabular}{ l l }
runtype & Keyword to determine runtype. Can be 1 or 2. \
& I don't want to hardcode this description twice...\
param_1 & Keyword to determine the parameter of runtype = 1 \
end{tabular}
end{center}
end{table}

section{Runtype 2 description}
begin{table}
begin{center}
begin{tabular}{ l l }
runtype & Keyword to determine runtype. Can be 1 or 2. \
& I don't want to hardcode this description twice...\
param_2 & Keyword to determine the parameter of runtype = 2 \
end{tabular}
end{center}
end{table}









share|improve this question







New contributor




Nordico is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











I have a list of keywords and descriptions for those keywords. I would like to have tables for the different contexts in which these are used, containing only the relevant ones for the case. Some of these keywords repeat on the different contexts, so it would be ideal to write the description only once and then "reference" that description in each of my tables for ease of maintenance.



Example:



section{Runtype 1 description}
begin{table}
begin{center}
begin{tabular}{ l l }
runtype & Keyword to determine runtype. Can be 1 or 2. \
& I don't want to hardcode this description twice...\
param_1 & Keyword to determine the parameter of runtype = 1 \
end{tabular}
end{center}
end{table}

section{Runtype 2 description}
begin{table}
begin{center}
begin{tabular}{ l l }
runtype & Keyword to determine runtype. Can be 1 or 2. \
& I don't want to hardcode this description twice...\
param_2 & Keyword to determine the parameter of runtype = 2 \
end{tabular}
end{center}
end{table}






tables






share|improve this question







New contributor




Nordico is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











share|improve this question







New contributor




Nordico is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









share|improve this question




share|improve this question






New contributor




Nordico is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









asked Nov 27 at 21:06









Nordico

1183




1183




New contributor




Nordico is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





New contributor





Nordico is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.






Nordico is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.








  • 1




    Welcome to TeX.SE!
    – Kurt
    Nov 27 at 21:11










  • @Kurt Thank you!
    – Nordico
    Nov 27 at 21:41














  • 1




    Welcome to TeX.SE!
    – Kurt
    Nov 27 at 21:11










  • @Kurt Thank you!
    – Nordico
    Nov 27 at 21:41








1




1




Welcome to TeX.SE!
– Kurt
Nov 27 at 21:11




Welcome to TeX.SE!
– Kurt
Nov 27 at 21:11












@Kurt Thank you!
– Nordico
Nov 27 at 21:41




@Kurt Thank you!
– Nordico
Nov 27 at 21:41










3 Answers
3






active

oldest

votes

















up vote
3
down vote



accepted










Below, I'm defining the following commands:





  • setkeyword{<keyword>}{<description>} can be used to declare a keyword.


  • getkeyword{<keyword>} retrieves the description you provided.


  • keywordtable{<key1>,<key2>,…} displays a table containing the descriptions corresponding to a comma-separated list of keywords.


(Note that keywords containing underscores are allowed.)



documentclass{article}

usepackage[T1]{fontenc} %% <- necessary for _ to be displayed correctly
usepackage{etoolbox} %% <- for csuse, csdef, ifcsdef and forcsvlist
usepackage{tabularx}

newcommand*keyname[1]{keyw@#1} %% <- just prepends key@

%% Define/retrieve a new keyword:
newcommandsetkeyword[2]{csdef{keyname{#1}}{#2}}
newcommand*getkeyword[1]{%
ifcsdef{keyname{#1}}{% %% <- if the key is defined...
csuse{keyname{#1}}% %% <- return the description
}{% %% <- otherwise...
errmessage{Undefined key: #1}% %% <- ERROR
}%
}

%% Display a table describing a list of keywords:
newcommand*keywordtable[1]{%
begin{tabularx}{linewidth}{lX}
forcsvlist{tableentry}{#1} %% <- apply tableentry to each value in #1
end{tabularx}%
}
newcommand*tableentry[1]{%
formattableentry{detokenize{#1}}{getkeyword{#1}}%
}
newcommandformattableentry[2]{ #1 & #2 \ }

% %% Declaration of keywords:
setkeyword{runtype}{Keyword to determine runtype. Can be 1 or 2. par
I don't want to hardcode this description twiceldots}
setkeyword{param_1}{Keyword to determine the parameter of runtype = 1}
setkeyword{param_2}{Keyword to determine the parameter of runtype = 2}

begin{document}

section{Runtype 1 description}
keywordtable{runtype,param_1}

section{Runtype 2 description}
keywordtable{runtype,param_2}

end{document}


output





Some remarks





  • setkeyword{<keyword>}{<description>} effectively defines keyw@<keyword> for you, so that it expands to <definition>. You can't use this macro directly because its name contains an @.


  • getkeyword{<keyword>} just calls keyw@<keyword>.

  • I'm using the e-TeX primitive detokenize to print the keyword. This command strips all tokens in its argument of their special meaning (by changing their catcodes), so you can for instance use detokenize{param_1} safely.

  • Without usepackage[T1]{fontenc}, underscores are displayed as " ̇", rather than as "_". You'll probably want to use this package anyway because of the reasons outlined here.

  • I'm using tabularx to create a table that has the same width as the current line width. You can replace linewidth by some other value if you want a different width (or just use tabular, in which case you should replace the X column type by something else).






share|improve this answer























  • Awesome! This is a very versatile method and thorough response, thank you very much! It is a bit complex and wordy (at least in setup) for something that feels conceptually simple, but apparently that's just how latex is. Not sure what's the difference between tabular and tabularx, but the later didn't compile correctly for me so went back to the former.
    – Nordico
    Nov 29 at 2:27






  • 1




    @Nordico begin{tabularx}{linewidth}{lX} creates a table of total width linewidth whose second column stretches to accommodate. It was very much inessential to the answer, so I probably shouldn't have used it. (I needed to use either the p{<some width>} or the X column type because one of the entries spans two lines.)
    – Circumscribe
    Nov 29 at 9:04




















up vote
2
down vote













documentclass[12pt]{article}
newcommandzzz{%
runtype & Keyword to determine runtype. Can be 1 or 2. \
& I don't want to hardcode this description twice...}
begin{document}
section{Runtype 1 description}
begin{table}[ht]
begin{center}
begin{tabular}{ l l }
zzz\
param_1 & Keyword to determine the parameter of runtype = 1 \
end{tabular}
end{center}
end{table}

section{Runtype 2 description}
begin{table}[ht]
begin{center}
begin{tabular}{ l l }
zzz\
param_2 & Keyword to determine the parameter of runtype = 2 \
end{tabular}
end{center}
end{table}
end{document}


enter image description here






share|improve this answer





















  • Ok, this works but feels like using a cannon to kill a fly. More precisely: I need to use this with around a hundred keywords, is defining a hundred newcommand to use as a "reference dictionary" advisable? How can I use descriptive names (tablekey_keyname) without using underscores?
    – Nordico
    Nov 27 at 21:20










  • @Nordico As to how to use underscores in a command name, options are limited: 1) change catcode of _ (not recommended, as it breaks subscript math), or 2) csdef and csuse with the etoolbox package (recommended if you insist on underscore in name)
    – Steven B. Segletes
    Nov 27 at 21:24












  • I mean, not necessarily an underscore, it can be other symbol ("tablekey.keyname") or a way of structuring the commands (like an equivalent to C++ namespaces, so I could do "tablekey::keyname"), anything that makes it more human readable/usable than just altogether "tablekeykeyname".
    – Nordico
    Nov 27 at 21:29








  • 1




    @Nordico In my example, add catcode`:=11 as the first line after documentclass, This changes : to be a "letter". Then newcommandzz:z{...} can be defined and later used as zz:z. What I don't know is if this breaks anything (e.g., spacing, hyphenation), if you use : as a normal character.
    – Steven B. Segletes
    Nov 27 at 21:36








  • 1




    I thought zzz was reserved for @David Carlisle ;-)
    – Raoul Kessels
    Nov 28 at 11:12


















up vote
1
down vote













It depends on where you want to first key the description you want to repeat.



Probably the best place is in the document preamble or in an external file that you can input.



documentclass{article}
usepackage{xparse}

% a few line of code for setting up the system
ExplSyntaxOn

NewDocumentCommand{newdesc}{mm}
{% #1 is a key, #2 is the description
prop_gput:Nnn g_nordico_descriptions_plist { #1 } { #2 }
}

NewDocumentCommand{getdesc}{m}
{% #1 is a key
prop_if_in:NnTF g_nordico_descriptions_plist { #1 }
{ prop_item:Nn g_nordico_descriptions_plist { #1 } }
{ ???~non~existent~description~??? }
}

prop_new:N g_nordico_descriptions_plist

ExplSyntaxOff

% the descriptions (they can go in an external file
% say desc.tex and here you'd do input{desc}

newdesc{A}{I don't want to hardcode this description twice...}

begin{document}

section{Runtype 1 description}
begin{center}
begin{tabular}{ l l }
runtype & Keyword to determine runtype. Can be 1 or 2. \
& getdesc{A} \
param_1 & Keyword to determine the parameter of runtype = 1 \
end{tabular}
end{center}

section{Runtype 2 description}
begin{center}
begin{tabular}{ l l }
runtype & Keyword to determine runtype. Can be 1 or 2. \
& getdesc{A} \
param_2 & Keyword to determine the parameter of runtype = 2 \
end{tabular}
end{center}

end{document}


Note that it is not at all necessary to place a tabular in a floating table environment (which might make the tabular go to another page).



enter image description here






share|improve this answer





















    Your Answer








    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "85"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    convertImagesToLinks: false,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: null,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });






    Nordico is a new contributor. Be nice, and check out our Code of Conduct.










    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f462072%2fhow-to-repeat-the-same-content-in-different-tables%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    3 Answers
    3






    active

    oldest

    votes








    3 Answers
    3






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes








    up vote
    3
    down vote



    accepted










    Below, I'm defining the following commands:





    • setkeyword{<keyword>}{<description>} can be used to declare a keyword.


    • getkeyword{<keyword>} retrieves the description you provided.


    • keywordtable{<key1>,<key2>,…} displays a table containing the descriptions corresponding to a comma-separated list of keywords.


    (Note that keywords containing underscores are allowed.)



    documentclass{article}

    usepackage[T1]{fontenc} %% <- necessary for _ to be displayed correctly
    usepackage{etoolbox} %% <- for csuse, csdef, ifcsdef and forcsvlist
    usepackage{tabularx}

    newcommand*keyname[1]{keyw@#1} %% <- just prepends key@

    %% Define/retrieve a new keyword:
    newcommandsetkeyword[2]{csdef{keyname{#1}}{#2}}
    newcommand*getkeyword[1]{%
    ifcsdef{keyname{#1}}{% %% <- if the key is defined...
    csuse{keyname{#1}}% %% <- return the description
    }{% %% <- otherwise...
    errmessage{Undefined key: #1}% %% <- ERROR
    }%
    }

    %% Display a table describing a list of keywords:
    newcommand*keywordtable[1]{%
    begin{tabularx}{linewidth}{lX}
    forcsvlist{tableentry}{#1} %% <- apply tableentry to each value in #1
    end{tabularx}%
    }
    newcommand*tableentry[1]{%
    formattableentry{detokenize{#1}}{getkeyword{#1}}%
    }
    newcommandformattableentry[2]{ #1 & #2 \ }

    % %% Declaration of keywords:
    setkeyword{runtype}{Keyword to determine runtype. Can be 1 or 2. par
    I don't want to hardcode this description twiceldots}
    setkeyword{param_1}{Keyword to determine the parameter of runtype = 1}
    setkeyword{param_2}{Keyword to determine the parameter of runtype = 2}

    begin{document}

    section{Runtype 1 description}
    keywordtable{runtype,param_1}

    section{Runtype 2 description}
    keywordtable{runtype,param_2}

    end{document}


    output





    Some remarks





    • setkeyword{<keyword>}{<description>} effectively defines keyw@<keyword> for you, so that it expands to <definition>. You can't use this macro directly because its name contains an @.


    • getkeyword{<keyword>} just calls keyw@<keyword>.

    • I'm using the e-TeX primitive detokenize to print the keyword. This command strips all tokens in its argument of their special meaning (by changing their catcodes), so you can for instance use detokenize{param_1} safely.

    • Without usepackage[T1]{fontenc}, underscores are displayed as " ̇", rather than as "_". You'll probably want to use this package anyway because of the reasons outlined here.

    • I'm using tabularx to create a table that has the same width as the current line width. You can replace linewidth by some other value if you want a different width (or just use tabular, in which case you should replace the X column type by something else).






    share|improve this answer























    • Awesome! This is a very versatile method and thorough response, thank you very much! It is a bit complex and wordy (at least in setup) for something that feels conceptually simple, but apparently that's just how latex is. Not sure what's the difference between tabular and tabularx, but the later didn't compile correctly for me so went back to the former.
      – Nordico
      Nov 29 at 2:27






    • 1




      @Nordico begin{tabularx}{linewidth}{lX} creates a table of total width linewidth whose second column stretches to accommodate. It was very much inessential to the answer, so I probably shouldn't have used it. (I needed to use either the p{<some width>} or the X column type because one of the entries spans two lines.)
      – Circumscribe
      Nov 29 at 9:04

















    up vote
    3
    down vote



    accepted










    Below, I'm defining the following commands:





    • setkeyword{<keyword>}{<description>} can be used to declare a keyword.


    • getkeyword{<keyword>} retrieves the description you provided.


    • keywordtable{<key1>,<key2>,…} displays a table containing the descriptions corresponding to a comma-separated list of keywords.


    (Note that keywords containing underscores are allowed.)



    documentclass{article}

    usepackage[T1]{fontenc} %% <- necessary for _ to be displayed correctly
    usepackage{etoolbox} %% <- for csuse, csdef, ifcsdef and forcsvlist
    usepackage{tabularx}

    newcommand*keyname[1]{keyw@#1} %% <- just prepends key@

    %% Define/retrieve a new keyword:
    newcommandsetkeyword[2]{csdef{keyname{#1}}{#2}}
    newcommand*getkeyword[1]{%
    ifcsdef{keyname{#1}}{% %% <- if the key is defined...
    csuse{keyname{#1}}% %% <- return the description
    }{% %% <- otherwise...
    errmessage{Undefined key: #1}% %% <- ERROR
    }%
    }

    %% Display a table describing a list of keywords:
    newcommand*keywordtable[1]{%
    begin{tabularx}{linewidth}{lX}
    forcsvlist{tableentry}{#1} %% <- apply tableentry to each value in #1
    end{tabularx}%
    }
    newcommand*tableentry[1]{%
    formattableentry{detokenize{#1}}{getkeyword{#1}}%
    }
    newcommandformattableentry[2]{ #1 & #2 \ }

    % %% Declaration of keywords:
    setkeyword{runtype}{Keyword to determine runtype. Can be 1 or 2. par
    I don't want to hardcode this description twiceldots}
    setkeyword{param_1}{Keyword to determine the parameter of runtype = 1}
    setkeyword{param_2}{Keyword to determine the parameter of runtype = 2}

    begin{document}

    section{Runtype 1 description}
    keywordtable{runtype,param_1}

    section{Runtype 2 description}
    keywordtable{runtype,param_2}

    end{document}


    output





    Some remarks





    • setkeyword{<keyword>}{<description>} effectively defines keyw@<keyword> for you, so that it expands to <definition>. You can't use this macro directly because its name contains an @.


    • getkeyword{<keyword>} just calls keyw@<keyword>.

    • I'm using the e-TeX primitive detokenize to print the keyword. This command strips all tokens in its argument of their special meaning (by changing their catcodes), so you can for instance use detokenize{param_1} safely.

    • Without usepackage[T1]{fontenc}, underscores are displayed as " ̇", rather than as "_". You'll probably want to use this package anyway because of the reasons outlined here.

    • I'm using tabularx to create a table that has the same width as the current line width. You can replace linewidth by some other value if you want a different width (or just use tabular, in which case you should replace the X column type by something else).






    share|improve this answer























    • Awesome! This is a very versatile method and thorough response, thank you very much! It is a bit complex and wordy (at least in setup) for something that feels conceptually simple, but apparently that's just how latex is. Not sure what's the difference between tabular and tabularx, but the later didn't compile correctly for me so went back to the former.
      – Nordico
      Nov 29 at 2:27






    • 1




      @Nordico begin{tabularx}{linewidth}{lX} creates a table of total width linewidth whose second column stretches to accommodate. It was very much inessential to the answer, so I probably shouldn't have used it. (I needed to use either the p{<some width>} or the X column type because one of the entries spans two lines.)
      – Circumscribe
      Nov 29 at 9:04















    up vote
    3
    down vote



    accepted







    up vote
    3
    down vote



    accepted






    Below, I'm defining the following commands:





    • setkeyword{<keyword>}{<description>} can be used to declare a keyword.


    • getkeyword{<keyword>} retrieves the description you provided.


    • keywordtable{<key1>,<key2>,…} displays a table containing the descriptions corresponding to a comma-separated list of keywords.


    (Note that keywords containing underscores are allowed.)



    documentclass{article}

    usepackage[T1]{fontenc} %% <- necessary for _ to be displayed correctly
    usepackage{etoolbox} %% <- for csuse, csdef, ifcsdef and forcsvlist
    usepackage{tabularx}

    newcommand*keyname[1]{keyw@#1} %% <- just prepends key@

    %% Define/retrieve a new keyword:
    newcommandsetkeyword[2]{csdef{keyname{#1}}{#2}}
    newcommand*getkeyword[1]{%
    ifcsdef{keyname{#1}}{% %% <- if the key is defined...
    csuse{keyname{#1}}% %% <- return the description
    }{% %% <- otherwise...
    errmessage{Undefined key: #1}% %% <- ERROR
    }%
    }

    %% Display a table describing a list of keywords:
    newcommand*keywordtable[1]{%
    begin{tabularx}{linewidth}{lX}
    forcsvlist{tableentry}{#1} %% <- apply tableentry to each value in #1
    end{tabularx}%
    }
    newcommand*tableentry[1]{%
    formattableentry{detokenize{#1}}{getkeyword{#1}}%
    }
    newcommandformattableentry[2]{ #1 & #2 \ }

    % %% Declaration of keywords:
    setkeyword{runtype}{Keyword to determine runtype. Can be 1 or 2. par
    I don't want to hardcode this description twiceldots}
    setkeyword{param_1}{Keyword to determine the parameter of runtype = 1}
    setkeyword{param_2}{Keyword to determine the parameter of runtype = 2}

    begin{document}

    section{Runtype 1 description}
    keywordtable{runtype,param_1}

    section{Runtype 2 description}
    keywordtable{runtype,param_2}

    end{document}


    output





    Some remarks





    • setkeyword{<keyword>}{<description>} effectively defines keyw@<keyword> for you, so that it expands to <definition>. You can't use this macro directly because its name contains an @.


    • getkeyword{<keyword>} just calls keyw@<keyword>.

    • I'm using the e-TeX primitive detokenize to print the keyword. This command strips all tokens in its argument of their special meaning (by changing their catcodes), so you can for instance use detokenize{param_1} safely.

    • Without usepackage[T1]{fontenc}, underscores are displayed as " ̇", rather than as "_". You'll probably want to use this package anyway because of the reasons outlined here.

    • I'm using tabularx to create a table that has the same width as the current line width. You can replace linewidth by some other value if you want a different width (or just use tabular, in which case you should replace the X column type by something else).






    share|improve this answer














    Below, I'm defining the following commands:





    • setkeyword{<keyword>}{<description>} can be used to declare a keyword.


    • getkeyword{<keyword>} retrieves the description you provided.


    • keywordtable{<key1>,<key2>,…} displays a table containing the descriptions corresponding to a comma-separated list of keywords.


    (Note that keywords containing underscores are allowed.)



    documentclass{article}

    usepackage[T1]{fontenc} %% <- necessary for _ to be displayed correctly
    usepackage{etoolbox} %% <- for csuse, csdef, ifcsdef and forcsvlist
    usepackage{tabularx}

    newcommand*keyname[1]{keyw@#1} %% <- just prepends key@

    %% Define/retrieve a new keyword:
    newcommandsetkeyword[2]{csdef{keyname{#1}}{#2}}
    newcommand*getkeyword[1]{%
    ifcsdef{keyname{#1}}{% %% <- if the key is defined...
    csuse{keyname{#1}}% %% <- return the description
    }{% %% <- otherwise...
    errmessage{Undefined key: #1}% %% <- ERROR
    }%
    }

    %% Display a table describing a list of keywords:
    newcommand*keywordtable[1]{%
    begin{tabularx}{linewidth}{lX}
    forcsvlist{tableentry}{#1} %% <- apply tableentry to each value in #1
    end{tabularx}%
    }
    newcommand*tableentry[1]{%
    formattableentry{detokenize{#1}}{getkeyword{#1}}%
    }
    newcommandformattableentry[2]{ #1 & #2 \ }

    % %% Declaration of keywords:
    setkeyword{runtype}{Keyword to determine runtype. Can be 1 or 2. par
    I don't want to hardcode this description twiceldots}
    setkeyword{param_1}{Keyword to determine the parameter of runtype = 1}
    setkeyword{param_2}{Keyword to determine the parameter of runtype = 2}

    begin{document}

    section{Runtype 1 description}
    keywordtable{runtype,param_1}

    section{Runtype 2 description}
    keywordtable{runtype,param_2}

    end{document}


    output





    Some remarks





    • setkeyword{<keyword>}{<description>} effectively defines keyw@<keyword> for you, so that it expands to <definition>. You can't use this macro directly because its name contains an @.


    • getkeyword{<keyword>} just calls keyw@<keyword>.

    • I'm using the e-TeX primitive detokenize to print the keyword. This command strips all tokens in its argument of their special meaning (by changing their catcodes), so you can for instance use detokenize{param_1} safely.

    • Without usepackage[T1]{fontenc}, underscores are displayed as " ̇", rather than as "_". You'll probably want to use this package anyway because of the reasons outlined here.

    • I'm using tabularx to create a table that has the same width as the current line width. You can replace linewidth by some other value if you want a different width (or just use tabular, in which case you should replace the X column type by something else).







    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited Nov 27 at 23:58









    Werner

    433k609531634




    433k609531634










    answered Nov 27 at 23:40









    Circumscribe

    3,3971328




    3,3971328












    • Awesome! This is a very versatile method and thorough response, thank you very much! It is a bit complex and wordy (at least in setup) for something that feels conceptually simple, but apparently that's just how latex is. Not sure what's the difference between tabular and tabularx, but the later didn't compile correctly for me so went back to the former.
      – Nordico
      Nov 29 at 2:27






    • 1




      @Nordico begin{tabularx}{linewidth}{lX} creates a table of total width linewidth whose second column stretches to accommodate. It was very much inessential to the answer, so I probably shouldn't have used it. (I needed to use either the p{<some width>} or the X column type because one of the entries spans two lines.)
      – Circumscribe
      Nov 29 at 9:04




















    • Awesome! This is a very versatile method and thorough response, thank you very much! It is a bit complex and wordy (at least in setup) for something that feels conceptually simple, but apparently that's just how latex is. Not sure what's the difference between tabular and tabularx, but the later didn't compile correctly for me so went back to the former.
      – Nordico
      Nov 29 at 2:27






    • 1




      @Nordico begin{tabularx}{linewidth}{lX} creates a table of total width linewidth whose second column stretches to accommodate. It was very much inessential to the answer, so I probably shouldn't have used it. (I needed to use either the p{<some width>} or the X column type because one of the entries spans two lines.)
      – Circumscribe
      Nov 29 at 9:04


















    Awesome! This is a very versatile method and thorough response, thank you very much! It is a bit complex and wordy (at least in setup) for something that feels conceptually simple, but apparently that's just how latex is. Not sure what's the difference between tabular and tabularx, but the later didn't compile correctly for me so went back to the former.
    – Nordico
    Nov 29 at 2:27




    Awesome! This is a very versatile method and thorough response, thank you very much! It is a bit complex and wordy (at least in setup) for something that feels conceptually simple, but apparently that's just how latex is. Not sure what's the difference between tabular and tabularx, but the later didn't compile correctly for me so went back to the former.
    – Nordico
    Nov 29 at 2:27




    1




    1




    @Nordico begin{tabularx}{linewidth}{lX} creates a table of total width linewidth whose second column stretches to accommodate. It was very much inessential to the answer, so I probably shouldn't have used it. (I needed to use either the p{<some width>} or the X column type because one of the entries spans two lines.)
    – Circumscribe
    Nov 29 at 9:04






    @Nordico begin{tabularx}{linewidth}{lX} creates a table of total width linewidth whose second column stretches to accommodate. It was very much inessential to the answer, so I probably shouldn't have used it. (I needed to use either the p{<some width>} or the X column type because one of the entries spans two lines.)
    – Circumscribe
    Nov 29 at 9:04












    up vote
    2
    down vote













    documentclass[12pt]{article}
    newcommandzzz{%
    runtype & Keyword to determine runtype. Can be 1 or 2. \
    & I don't want to hardcode this description twice...}
    begin{document}
    section{Runtype 1 description}
    begin{table}[ht]
    begin{center}
    begin{tabular}{ l l }
    zzz\
    param_1 & Keyword to determine the parameter of runtype = 1 \
    end{tabular}
    end{center}
    end{table}

    section{Runtype 2 description}
    begin{table}[ht]
    begin{center}
    begin{tabular}{ l l }
    zzz\
    param_2 & Keyword to determine the parameter of runtype = 2 \
    end{tabular}
    end{center}
    end{table}
    end{document}


    enter image description here






    share|improve this answer





















    • Ok, this works but feels like using a cannon to kill a fly. More precisely: I need to use this with around a hundred keywords, is defining a hundred newcommand to use as a "reference dictionary" advisable? How can I use descriptive names (tablekey_keyname) without using underscores?
      – Nordico
      Nov 27 at 21:20










    • @Nordico As to how to use underscores in a command name, options are limited: 1) change catcode of _ (not recommended, as it breaks subscript math), or 2) csdef and csuse with the etoolbox package (recommended if you insist on underscore in name)
      – Steven B. Segletes
      Nov 27 at 21:24












    • I mean, not necessarily an underscore, it can be other symbol ("tablekey.keyname") or a way of structuring the commands (like an equivalent to C++ namespaces, so I could do "tablekey::keyname"), anything that makes it more human readable/usable than just altogether "tablekeykeyname".
      – Nordico
      Nov 27 at 21:29








    • 1




      @Nordico In my example, add catcode`:=11 as the first line after documentclass, This changes : to be a "letter". Then newcommandzz:z{...} can be defined and later used as zz:z. What I don't know is if this breaks anything (e.g., spacing, hyphenation), if you use : as a normal character.
      – Steven B. Segletes
      Nov 27 at 21:36








    • 1




      I thought zzz was reserved for @David Carlisle ;-)
      – Raoul Kessels
      Nov 28 at 11:12















    up vote
    2
    down vote













    documentclass[12pt]{article}
    newcommandzzz{%
    runtype & Keyword to determine runtype. Can be 1 or 2. \
    & I don't want to hardcode this description twice...}
    begin{document}
    section{Runtype 1 description}
    begin{table}[ht]
    begin{center}
    begin{tabular}{ l l }
    zzz\
    param_1 & Keyword to determine the parameter of runtype = 1 \
    end{tabular}
    end{center}
    end{table}

    section{Runtype 2 description}
    begin{table}[ht]
    begin{center}
    begin{tabular}{ l l }
    zzz\
    param_2 & Keyword to determine the parameter of runtype = 2 \
    end{tabular}
    end{center}
    end{table}
    end{document}


    enter image description here






    share|improve this answer





















    • Ok, this works but feels like using a cannon to kill a fly. More precisely: I need to use this with around a hundred keywords, is defining a hundred newcommand to use as a "reference dictionary" advisable? How can I use descriptive names (tablekey_keyname) without using underscores?
      – Nordico
      Nov 27 at 21:20










    • @Nordico As to how to use underscores in a command name, options are limited: 1) change catcode of _ (not recommended, as it breaks subscript math), or 2) csdef and csuse with the etoolbox package (recommended if you insist on underscore in name)
      – Steven B. Segletes
      Nov 27 at 21:24












    • I mean, not necessarily an underscore, it can be other symbol ("tablekey.keyname") or a way of structuring the commands (like an equivalent to C++ namespaces, so I could do "tablekey::keyname"), anything that makes it more human readable/usable than just altogether "tablekeykeyname".
      – Nordico
      Nov 27 at 21:29








    • 1




      @Nordico In my example, add catcode`:=11 as the first line after documentclass, This changes : to be a "letter". Then newcommandzz:z{...} can be defined and later used as zz:z. What I don't know is if this breaks anything (e.g., spacing, hyphenation), if you use : as a normal character.
      – Steven B. Segletes
      Nov 27 at 21:36








    • 1




      I thought zzz was reserved for @David Carlisle ;-)
      – Raoul Kessels
      Nov 28 at 11:12













    up vote
    2
    down vote










    up vote
    2
    down vote









    documentclass[12pt]{article}
    newcommandzzz{%
    runtype & Keyword to determine runtype. Can be 1 or 2. \
    & I don't want to hardcode this description twice...}
    begin{document}
    section{Runtype 1 description}
    begin{table}[ht]
    begin{center}
    begin{tabular}{ l l }
    zzz\
    param_1 & Keyword to determine the parameter of runtype = 1 \
    end{tabular}
    end{center}
    end{table}

    section{Runtype 2 description}
    begin{table}[ht]
    begin{center}
    begin{tabular}{ l l }
    zzz\
    param_2 & Keyword to determine the parameter of runtype = 2 \
    end{tabular}
    end{center}
    end{table}
    end{document}


    enter image description here






    share|improve this answer












    documentclass[12pt]{article}
    newcommandzzz{%
    runtype & Keyword to determine runtype. Can be 1 or 2. \
    & I don't want to hardcode this description twice...}
    begin{document}
    section{Runtype 1 description}
    begin{table}[ht]
    begin{center}
    begin{tabular}{ l l }
    zzz\
    param_1 & Keyword to determine the parameter of runtype = 1 \
    end{tabular}
    end{center}
    end{table}

    section{Runtype 2 description}
    begin{table}[ht]
    begin{center}
    begin{tabular}{ l l }
    zzz\
    param_2 & Keyword to determine the parameter of runtype = 2 \
    end{tabular}
    end{center}
    end{table}
    end{document}


    enter image description here







    share|improve this answer












    share|improve this answer



    share|improve this answer










    answered Nov 27 at 21:09









    Steven B. Segletes

    152k9191398




    152k9191398












    • Ok, this works but feels like using a cannon to kill a fly. More precisely: I need to use this with around a hundred keywords, is defining a hundred newcommand to use as a "reference dictionary" advisable? How can I use descriptive names (tablekey_keyname) without using underscores?
      – Nordico
      Nov 27 at 21:20










    • @Nordico As to how to use underscores in a command name, options are limited: 1) change catcode of _ (not recommended, as it breaks subscript math), or 2) csdef and csuse with the etoolbox package (recommended if you insist on underscore in name)
      – Steven B. Segletes
      Nov 27 at 21:24












    • I mean, not necessarily an underscore, it can be other symbol ("tablekey.keyname") or a way of structuring the commands (like an equivalent to C++ namespaces, so I could do "tablekey::keyname"), anything that makes it more human readable/usable than just altogether "tablekeykeyname".
      – Nordico
      Nov 27 at 21:29








    • 1




      @Nordico In my example, add catcode`:=11 as the first line after documentclass, This changes : to be a "letter". Then newcommandzz:z{...} can be defined and later used as zz:z. What I don't know is if this breaks anything (e.g., spacing, hyphenation), if you use : as a normal character.
      – Steven B. Segletes
      Nov 27 at 21:36








    • 1




      I thought zzz was reserved for @David Carlisle ;-)
      – Raoul Kessels
      Nov 28 at 11:12


















    • Ok, this works but feels like using a cannon to kill a fly. More precisely: I need to use this with around a hundred keywords, is defining a hundred newcommand to use as a "reference dictionary" advisable? How can I use descriptive names (tablekey_keyname) without using underscores?
      – Nordico
      Nov 27 at 21:20










    • @Nordico As to how to use underscores in a command name, options are limited: 1) change catcode of _ (not recommended, as it breaks subscript math), or 2) csdef and csuse with the etoolbox package (recommended if you insist on underscore in name)
      – Steven B. Segletes
      Nov 27 at 21:24












    • I mean, not necessarily an underscore, it can be other symbol ("tablekey.keyname") or a way of structuring the commands (like an equivalent to C++ namespaces, so I could do "tablekey::keyname"), anything that makes it more human readable/usable than just altogether "tablekeykeyname".
      – Nordico
      Nov 27 at 21:29








    • 1




      @Nordico In my example, add catcode`:=11 as the first line after documentclass, This changes : to be a "letter". Then newcommandzz:z{...} can be defined and later used as zz:z. What I don't know is if this breaks anything (e.g., spacing, hyphenation), if you use : as a normal character.
      – Steven B. Segletes
      Nov 27 at 21:36








    • 1




      I thought zzz was reserved for @David Carlisle ;-)
      – Raoul Kessels
      Nov 28 at 11:12
















    Ok, this works but feels like using a cannon to kill a fly. More precisely: I need to use this with around a hundred keywords, is defining a hundred newcommand to use as a "reference dictionary" advisable? How can I use descriptive names (tablekey_keyname) without using underscores?
    – Nordico
    Nov 27 at 21:20




    Ok, this works but feels like using a cannon to kill a fly. More precisely: I need to use this with around a hundred keywords, is defining a hundred newcommand to use as a "reference dictionary" advisable? How can I use descriptive names (tablekey_keyname) without using underscores?
    – Nordico
    Nov 27 at 21:20












    @Nordico As to how to use underscores in a command name, options are limited: 1) change catcode of _ (not recommended, as it breaks subscript math), or 2) csdef and csuse with the etoolbox package (recommended if you insist on underscore in name)
    – Steven B. Segletes
    Nov 27 at 21:24






    @Nordico As to how to use underscores in a command name, options are limited: 1) change catcode of _ (not recommended, as it breaks subscript math), or 2) csdef and csuse with the etoolbox package (recommended if you insist on underscore in name)
    – Steven B. Segletes
    Nov 27 at 21:24














    I mean, not necessarily an underscore, it can be other symbol ("tablekey.keyname") or a way of structuring the commands (like an equivalent to C++ namespaces, so I could do "tablekey::keyname"), anything that makes it more human readable/usable than just altogether "tablekeykeyname".
    – Nordico
    Nov 27 at 21:29






    I mean, not necessarily an underscore, it can be other symbol ("tablekey.keyname") or a way of structuring the commands (like an equivalent to C++ namespaces, so I could do "tablekey::keyname"), anything that makes it more human readable/usable than just altogether "tablekeykeyname".
    – Nordico
    Nov 27 at 21:29






    1




    1




    @Nordico In my example, add catcode`:=11 as the first line after documentclass, This changes : to be a "letter". Then newcommandzz:z{...} can be defined and later used as zz:z. What I don't know is if this breaks anything (e.g., spacing, hyphenation), if you use : as a normal character.
    – Steven B. Segletes
    Nov 27 at 21:36






    @Nordico In my example, add catcode`:=11 as the first line after documentclass, This changes : to be a "letter". Then newcommandzz:z{...} can be defined and later used as zz:z. What I don't know is if this breaks anything (e.g., spacing, hyphenation), if you use : as a normal character.
    – Steven B. Segletes
    Nov 27 at 21:36






    1




    1




    I thought zzz was reserved for @David Carlisle ;-)
    – Raoul Kessels
    Nov 28 at 11:12




    I thought zzz was reserved for @David Carlisle ;-)
    – Raoul Kessels
    Nov 28 at 11:12










    up vote
    1
    down vote













    It depends on where you want to first key the description you want to repeat.



    Probably the best place is in the document preamble or in an external file that you can input.



    documentclass{article}
    usepackage{xparse}

    % a few line of code for setting up the system
    ExplSyntaxOn

    NewDocumentCommand{newdesc}{mm}
    {% #1 is a key, #2 is the description
    prop_gput:Nnn g_nordico_descriptions_plist { #1 } { #2 }
    }

    NewDocumentCommand{getdesc}{m}
    {% #1 is a key
    prop_if_in:NnTF g_nordico_descriptions_plist { #1 }
    { prop_item:Nn g_nordico_descriptions_plist { #1 } }
    { ???~non~existent~description~??? }
    }

    prop_new:N g_nordico_descriptions_plist

    ExplSyntaxOff

    % the descriptions (they can go in an external file
    % say desc.tex and here you'd do input{desc}

    newdesc{A}{I don't want to hardcode this description twice...}

    begin{document}

    section{Runtype 1 description}
    begin{center}
    begin{tabular}{ l l }
    runtype & Keyword to determine runtype. Can be 1 or 2. \
    & getdesc{A} \
    param_1 & Keyword to determine the parameter of runtype = 1 \
    end{tabular}
    end{center}

    section{Runtype 2 description}
    begin{center}
    begin{tabular}{ l l }
    runtype & Keyword to determine runtype. Can be 1 or 2. \
    & getdesc{A} \
    param_2 & Keyword to determine the parameter of runtype = 2 \
    end{tabular}
    end{center}

    end{document}


    Note that it is not at all necessary to place a tabular in a floating table environment (which might make the tabular go to another page).



    enter image description here






    share|improve this answer

























      up vote
      1
      down vote













      It depends on where you want to first key the description you want to repeat.



      Probably the best place is in the document preamble or in an external file that you can input.



      documentclass{article}
      usepackage{xparse}

      % a few line of code for setting up the system
      ExplSyntaxOn

      NewDocumentCommand{newdesc}{mm}
      {% #1 is a key, #2 is the description
      prop_gput:Nnn g_nordico_descriptions_plist { #1 } { #2 }
      }

      NewDocumentCommand{getdesc}{m}
      {% #1 is a key
      prop_if_in:NnTF g_nordico_descriptions_plist { #1 }
      { prop_item:Nn g_nordico_descriptions_plist { #1 } }
      { ???~non~existent~description~??? }
      }

      prop_new:N g_nordico_descriptions_plist

      ExplSyntaxOff

      % the descriptions (they can go in an external file
      % say desc.tex and here you'd do input{desc}

      newdesc{A}{I don't want to hardcode this description twice...}

      begin{document}

      section{Runtype 1 description}
      begin{center}
      begin{tabular}{ l l }
      runtype & Keyword to determine runtype. Can be 1 or 2. \
      & getdesc{A} \
      param_1 & Keyword to determine the parameter of runtype = 1 \
      end{tabular}
      end{center}

      section{Runtype 2 description}
      begin{center}
      begin{tabular}{ l l }
      runtype & Keyword to determine runtype. Can be 1 or 2. \
      & getdesc{A} \
      param_2 & Keyword to determine the parameter of runtype = 2 \
      end{tabular}
      end{center}

      end{document}


      Note that it is not at all necessary to place a tabular in a floating table environment (which might make the tabular go to another page).



      enter image description here






      share|improve this answer























        up vote
        1
        down vote










        up vote
        1
        down vote









        It depends on where you want to first key the description you want to repeat.



        Probably the best place is in the document preamble or in an external file that you can input.



        documentclass{article}
        usepackage{xparse}

        % a few line of code for setting up the system
        ExplSyntaxOn

        NewDocumentCommand{newdesc}{mm}
        {% #1 is a key, #2 is the description
        prop_gput:Nnn g_nordico_descriptions_plist { #1 } { #2 }
        }

        NewDocumentCommand{getdesc}{m}
        {% #1 is a key
        prop_if_in:NnTF g_nordico_descriptions_plist { #1 }
        { prop_item:Nn g_nordico_descriptions_plist { #1 } }
        { ???~non~existent~description~??? }
        }

        prop_new:N g_nordico_descriptions_plist

        ExplSyntaxOff

        % the descriptions (they can go in an external file
        % say desc.tex and here you'd do input{desc}

        newdesc{A}{I don't want to hardcode this description twice...}

        begin{document}

        section{Runtype 1 description}
        begin{center}
        begin{tabular}{ l l }
        runtype & Keyword to determine runtype. Can be 1 or 2. \
        & getdesc{A} \
        param_1 & Keyword to determine the parameter of runtype = 1 \
        end{tabular}
        end{center}

        section{Runtype 2 description}
        begin{center}
        begin{tabular}{ l l }
        runtype & Keyword to determine runtype. Can be 1 or 2. \
        & getdesc{A} \
        param_2 & Keyword to determine the parameter of runtype = 2 \
        end{tabular}
        end{center}

        end{document}


        Note that it is not at all necessary to place a tabular in a floating table environment (which might make the tabular go to another page).



        enter image description here






        share|improve this answer












        It depends on where you want to first key the description you want to repeat.



        Probably the best place is in the document preamble or in an external file that you can input.



        documentclass{article}
        usepackage{xparse}

        % a few line of code for setting up the system
        ExplSyntaxOn

        NewDocumentCommand{newdesc}{mm}
        {% #1 is a key, #2 is the description
        prop_gput:Nnn g_nordico_descriptions_plist { #1 } { #2 }
        }

        NewDocumentCommand{getdesc}{m}
        {% #1 is a key
        prop_if_in:NnTF g_nordico_descriptions_plist { #1 }
        { prop_item:Nn g_nordico_descriptions_plist { #1 } }
        { ???~non~existent~description~??? }
        }

        prop_new:N g_nordico_descriptions_plist

        ExplSyntaxOff

        % the descriptions (they can go in an external file
        % say desc.tex and here you'd do input{desc}

        newdesc{A}{I don't want to hardcode this description twice...}

        begin{document}

        section{Runtype 1 description}
        begin{center}
        begin{tabular}{ l l }
        runtype & Keyword to determine runtype. Can be 1 or 2. \
        & getdesc{A} \
        param_1 & Keyword to determine the parameter of runtype = 1 \
        end{tabular}
        end{center}

        section{Runtype 2 description}
        begin{center}
        begin{tabular}{ l l }
        runtype & Keyword to determine runtype. Can be 1 or 2. \
        & getdesc{A} \
        param_2 & Keyword to determine the parameter of runtype = 2 \
        end{tabular}
        end{center}

        end{document}


        Note that it is not at all necessary to place a tabular in a floating table environment (which might make the tabular go to another page).



        enter image description here







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 28 at 0:07









        egreg

        701k8618703144




        701k8618703144






















            Nordico is a new contributor. Be nice, and check out our Code of Conduct.










            draft saved

            draft discarded


















            Nordico is a new contributor. Be nice, and check out our Code of Conduct.













            Nordico is a new contributor. Be nice, and check out our Code of Conduct.












            Nordico is a new contributor. Be nice, and check out our Code of Conduct.
















            Thanks for contributing an answer to TeX - LaTeX Stack Exchange!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f462072%2fhow-to-repeat-the-same-content-in-different-tables%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            How did Captain America manage to do this?

            迪纳利

            南乌拉尔铁路局