1

I would like to create a meta.tex file in which the template user will fill-in some common values. I would like to let him choose among some predefined values:

%meta.tex
\title{Something Fun}
\author{John Doe}

% Uncomment ONE item \department{Foo} %\department{Bar} %\department{Foobar}

It would be better instead to do something like:

\departments{FOO=Foo, BAR=Bar, FOOBAR=Foobar}
\department{FOO}

What is the best way of doing it in LaTeX?

Looking for LaTeX enum on Google doesn't seem a clever advice :(

nowox
  • 1,375

2 Answers2

2

A fairly simple way to set up an enum-like structure is via helper macros whose name contains the "enum ID". So if you want to allow your users to choose between FOO, BAR and FOOBAR, you can define three internal helper macros \nowox@enum@FOO, \nowox@enum@BAR, \nowox@enum@FOOBAR. When your users select one enum value, you can check of the internal macro \nowox@enum@<user input> is defined, if so, use it (where "use" can actually mean very different things), if not throw an error that an invalid enum value was selected.

This approach is fairly flexible with regards to how and when you actually use or act on user input. In the example below each enum ID has a printable output. The printable output of the user-selected enum is stored (with \let) in a generic helper macro. The generic helper macro can then be used for typesetting. But it is entirely possible to think of a different use of the selection. For example you could store executable code in each enum helper macro and just execute that code when the enum is selected.

The package etoolbox is used to provide commands like \csdef to make things easier and avoid tons of \expandafters (What exactly do \csname and \endcsname do?, When to use \edef, \noexpand, and \expandafter?).

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage{babel}

\usepackage{etoolbox}

\makeatletter % internal name for user selection % can be given a default value % or generate an error if not set \newcommand*{\nowox@dep}{% \PackageError{nowox} {No department set} {Choose a valid department\MessageBreak with \string\department}}

% helper macro to typeset user-selected dep \newcommand*{\typesetmydep}{% \nowox@dep}

% create new enum values % {<id>}{<value>} \newcommand*{\mkdepartment}[1]{% \csdef{nowox@dep@#1}}

% user command to select department from % valid enum values \newcommand*{\department}[1]{% \ifcsundef{nowox@dep@#1} {\PackageError{nowox} {Department '#1' undefined} {Choose a valid department}} {\letcs\nowox@dep{nowox@dep@#1}}} \makeatother

\mkdepartment{foo}{Dep.~of~Foo} \mkdepartment{bar}{Dep.~of~Bar} \department{foo}

\begin{document} \typesetmydep

Lorem \end{document}

moewe
  • 175,683
1

In case things varying depending on "Department" are just some textual phrases:

Using a LaTeX-distro which is up to date you can maintain a property list for each department via expl3/xparse:

\documentclass{article}

%========================================================================================= \RequirePackage{xparse} \ExplSyntaxOn \NewDocumentCommand\Departments {m} { \keyval_parse:NNn __MYPREAMBLECODE_prop_const_from_keyval:n __MYPREAMBLECODE_prop_const_from_keyval:nn {#1} } \NewDocumentCommand\Department {m} { \prop_if_exist:cF {\MYPREAMBLECODE_DepartmentPropertiesPrefix: #1} { % An error about unknown Department/unknown property list: \msg_error:nnx {MYPREAMBLECODE} {UndefinedDepartment} {#1} } \cs_gset:Npx __MYPREAMBLECODE_SelectedDepartment: {\MYPREAMBLECODE_DepartmentPropertiesPrefix: #1} } \msg_new:nnnn {MYPREAMBLECODE} {UndefinedDepartment} {\token_to_str:N\Department:\ No\ properties\ defined\ for\ Department\ `\tl_to_str:n{#1}'\ \msg_line_context: .} {Use\ the\ command\ \token_to_str:N\Departments\ for\ specifying\ properties\ of\ Departments. } \prop_gput:Nnn \g_msg_module_type_prop { MYPREAMBLECODE } {} \prop_gput:Nnn \g_msg_module_name_prop { MYPREAMBLECODE } {Preamble-Code}

\NewDocumentCommand\GetSelectedDepartmentsPropertyValue{mm}{ % #1 = property % #2 = tokens in case property is not defined % Reasons could be: % 1. property is not defined for the selected department. % 2. selected department is not defined. % 3. \Departments or \Department was not called. % Could be a warning/error-message and/or some % default-value. \prop_if_exist:cTF __MYPREAMBLECODE_SelectedDepartment: { \prop_if_in:cnTF __MYPREAMBLECODE_SelectedDepartment: {#1} { \prop_item:cn __MYPREAMBLECODE_SelectedDepartment: {#1} } }{\use:n}{#2} } \cs_new:Nn __MYPREAMBLECODE_prop_const_from_keyval:n { __MYPREAMBLECODE_prop_const_from_keyval:nn {#1}{} } \cs_new:Nn __MYPREAMBLECODE_prop_const_from_keyval:nn { \prop_const_from_keyval:cn {\MYPREAMBLECODE_DepartmentPropertiesPrefix: #1} {#2} } \cs_new:Nn __MYPREAMBLECODE_SelectedDepartment: {} \cs_new:Nn \MYPREAMBLECODE_DepartmentPropertiesPrefix: {Department:} \ExplSyntaxOff %=========================================================================================

\Departments{ FOO={ Property1=FOO---Property1's value, Property2=FOO---Property2's value, Property3=FOO---Property3's value }, BAR={ Property1=BAR---Property1's value, Property2=BAR---Property2's value, Property3=BAR---Property3's value }, FOOBAR={ Property1=FOOBAR---Property1's value, Property2=FOOBAR---Property2's value, Property3=FOOBAR---Property3's value }, \empty={ Property1=[Nameless Department]---Property1's value, Property2=[Nameless Department]---Property2's value, Property3=[Nameless Department]---Property3's value }, }

\Department{FOO} %\Department{BAR} %\Department{FOOBAR} %\Department{} %\Department{FOOL}

\begin{document}

\GetSelectedDepartmentsPropertyValue{Property1}{\textsf{??}}

\GetSelectedDepartmentsPropertyValue{Property2}{\textsf{??}}

\GetSelectedDepartmentsPropertyValue{Property3}{\textsf{??}}

\GetSelectedDepartmentsPropertyValue{Property4}{\textsf{??}} % Property 4 is undefined with the selected department, therefore: ??

\end{document}

(With \Department{FOO} respective \Department{BAR} respective \Department{FOOBAR} the command \GetSelectedDepartmentsPropertyValue yields phrases defined for these departments.
With \Department{} and \Department{\empty} the command \GetSelectedDepartmentsPropertyValue yields phrases defined for the nameless department.
With \Department{FOOL} the command \GetSelectedDepartmentsPropertyValue for reason 2 always yields ⟨tokens in case property is not defined⟩.)

Ulrich Diez
  • 28,770