Salta al contenuto principale
Working from scratch, following simplicity

Come scrivere una macro LaTeX che non ha bisogno di un numero fisso di argomenti

Per rispondere a un commento in un vecchio articolo, ho scoperto un trucco interessante che aggira il numero fisso degli argomenti della macro di LaTeX. Nei prossimi paragrafi spiegherò l'idea di base per la creazione di una pseudo-tabella dinamica che supporta un multiplo di 4 argomenti alla volta.

Nel commento c'era una richiesta che si può riassumere così: «Come posso aggiungere una tabella che contenga gli esami universitari con data, esame, crediti e voto nel mio modello di CV EuroPASS e che non ne stravolga lo stile?».

La domanda è semplice e abbastanza facile da risolvere ma manualmente, cioè scrivendo un codice e ogni volta modificandolo da zero. Contro l'idea che accompagna il modello stesso: una serie di macro facili da chiamare e utilizzare.

Dal wiki LaTeX/Macros disponibile qui, per aggiungere un propri comando personalizzato, si deve usare:

\newcommand{name}[num]{definition}

Fondamentalmente, il comando richiede due argomenti: il nome del comando che si desidera creare e la definizione del comando. Nota che il nome del comando non può non essere racchiuso tra parentesi. L'argomento num tra parentesi quadre è facoltativo e specifica il numero di argomenti richiesti dal nuovo comando (ne sono possibili fino a 9). Se manca, il valore predefinito è 0, cioè nessun argomento consentito.

Come scrivere una macro LaTeX che non ha bisogno di un numero fisso di argomenti

Il problema di fondo

Quindi, se volessi realizzare una pratica macro che semplificasse la procedura per creare la tabella richiesta, come dovrei procedere? Avrei sicuramente molti problemi, a causa del numero di esami che l'utente deve evidenziare (tutti o i più importante per il CV?) e rimane il limite degli argomenti predefiniti che è 9. Ma soprattutto, ogni facoltà universitaria ha un numero fisso di esami, quindi non posso definire dall'inizio quante variabili dovrebbero essere inserite in una classica macro LaTeX.

In parole povere non posso stabilire di quanti argomenti abbia bisogno la mia macro, ma solo un numero multiplo di essi, ad esempio se voglio scrivere 4 esami: ho bisogno di 4x4 = 16 argomenti e così via.

L'unica soluzione è una macro che si ripete in funzione del numero di argomenti. Come ben descritto in questo articolo Writing a LaTeX macro that takes a variable number of arguments.

Riassumendo con una macro suddivisa nelle tre parti seguenti, sono in grado di risolvere il problema:

  1. \newcommand{\THE_MACRO_NAME}[4]{ #1 #2 #3 #4 \checknextarg}
  2. \newcommand{\checknextarg}{\@ifnextchar\bgroup{\gobblenextarg}{ }}
  3. \newcommand{\gobblenextarg}[4]{#1 #2 #3 #4\@ifnextchar\bgroup{\gobblenextarg}{ }}

La mia macro per l'Europass CV

Il codice per il file europasscv.cls:

% University exam transcript
\newcommand*\ecvexames[4]{%
\def\ecv@fccol{0.25} % because I want 4 column
	%header
	\setlength{\arrayrulewidth}{\ecv@langouterborderwidth}
	\ecvblueitem{Academic transcript}{
		\renewcommand{\arraystretch}{1.5}
		\setlength{\ecv@langtablewidth}{\ecv@rightcolwidth}
		\addtolength{\ecv@langtablewidth}{\arrayrulewidth}
		\arrayrulecolor{ecvtablebordercolor}
		\begin{tabular}[t]{m{\ecv@fccol\ecv@langtablewidth}|m{\ecv@fccol\ecv@langtablewidth}|m{\ecv@fccol\ecv@langtablewidth}|m{\ecv@fccol\ecv@langtablewidth}}
			\firsthline
			\centering \ecvbluestyle{Date}& \centering \ecvbluestyle{Exam} &\centering \ecvbluestyle{Credits}& \centering \ecvbluestyle{Grade} \tabularnewline
			\hline
			\centering{#1} &\centering{#2} &\centering{#3} &\centering{#4} \tabularnewline
			\hline
		\end{tabular}
	}
\checknextarg
}

\newcommand{\checknextarg}{\@ifnextchar\bgroup{\gobblenextarg}{
}}

\newcommand{\gobblenextarg}[4]{ 
\def\ecv@fccol{0.25}
	%header
	%\setlength{\arrayrulewidth}{\ecv@langouterborderwidth}
	\ecvblueitem[-5pt]{}{
		\renewcommand{\arraystretch}{1.5}
		\setlength{\ecv@langtablewidth}{\ecv@rightcolwidth}
		\addtolength{\ecv@langtablewidth}{\arrayrulewidth}
		\arrayrulecolor{ecvtablebordercolor}
                %\rowcolors{3}{white}{ecvtablebordercolor}
		\begin{tabular}[t]{m{\ecv@fccol\ecv@langtablewidth}|m{\ecv@fccol\ecv@langtablewidth}|m{\ecv@fccol\ecv@langtablewidth}|m{\ecv@fccol\ecv@langtablewidth}}
			\centering{#1} &\centering{#2} &\centering{#3} &\centering{#4} \tabularnewline
			\hline
		\end{tabular}
	}
\@ifnextchar\bgroup{\gobblenextarg}{
}}

Il codice per il file main.tex:

\ecvexames
{Date 1}{Exam 1}{Credits 1}{Grade 1}
{Date 2}{Exam 2}{Credits 2}{Grade 2}
{Date 3}{Exam 3}{Credits 3}{Grade 3}
{Date 4}{Exam 4}{Credits 4}{Grade 4}
{Date ...}{Exam ...}{Credits ...}{Grade ...}
{Date N}{Exam N}{Credits N}{Grade N}

Il risultato finale:

The final result of a LaTeX macro with variables arguments
Il risultato finale di una macro LaTeX con argomenti variabili

Download

Si può trovare e verificare il tutto in Overleaf e GitHub, nei link qui sotto:

Aggiungi un commento

Il contenuto di questo campo è privato e non verrà mostrato pubblicamente.

Plain text

  • Nessun tag HTML consentito.
  • Indirizzi web ed indirizzi e-mail diventano automaticamente dei link.
  • Linee e paragrafi vanno a capo automaticamente.
CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.

Aggiungi un commento

Il contenuto di questo campo è privato e non verrà mostrato pubblicamente.

Plain text

  • Nessun tag HTML consentito.
  • Indirizzi web ed indirizzi e-mail diventano automaticamente dei link.
  • Linee e paragrafi vanno a capo automaticamente.
CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.
Sponsored Links
Pubblicità

Nicola Rainiero

Ingegnere civile specializzato in geotecnica con l'ambizione di facilitare la propria attività lavorativa usando e creando software libero per un sapere condiviso e collettivo. Mi occupo anche di energie rinnovabili ed in particolare di geotermia a bassa entalpia. Sono da sempre appassionato di web design e modellazione 3D.