- Questo topic ha 17 risposte, 4 partecipanti ed è stato aggiornato l'ultima volta 8 anni, 4 mesi fa da
letteracdp.
-
CreatoreTopic
-
7 Aprile 2018 alle 17:42 #112843::
Ciao a tutti,
ho una domanda un po’ particolare: è possibile scrivere un codice che permetta di fare `\\comando{arg}` dove con `\comando{arg}` intendo semplicemente qualcosa definito come `\newcommand{\comando}[1]{comando#1}` e che poi venga considerata come stringa unica che diventa una stringa di comando con il backslash davanti?Esempio:
vorrei poter scrivere \comando{2} e poi far sì di poter ricavare da ciò \comando2Grazie mille!
Matteo
-
CreatoreTopic
-
AutoreRisposte
-
-
7 Aprile 2018 alle 19:58 #112844::
`\newcommand{\comand}[1]{\char92comando\{#2\}}`Qualunque cosa tu voglia fare con questo \comando, mi sembra una cosa un po’ strana; puoi giocare con la definizione che ti ho scritto, magari componendo il tutto come argomento di \texttt; ma se non spieghi meglio quanto ti ho scritto fa così: se nel documento .tex scrivi [tt]\comando{pippo}[/tt], nel documento pdf ti esce esattamante la stessa cosa scritta nel font corrente “\comando{pippo}”; se aggiungi \texttt, ti viene scritto nel documento pdf “[tt]\comando{pippo}[/tt]”.
-
8 Aprile 2018 alle 5:29 #112845::
Mi sono spiegato male, quello che ho bisogno io è leggermente diverso: riprendendo l’esempio avrei bisogno che l’output di `\comando{pippo}` fosse “semplicemente” comandopippo, ma poi avrei bisogno di poterci aggiungere un backslash davanti, ottenendo \comandopippo, in modo che il programma lo consideri un comando.Sto lavorando con il pacchetto “calculator” per svolgere delle operazioni aritmetiche su alcune serie di dati, e questo procedimento mi serve perché la sintassi per assegnare un valore ad una “variabile” è`\COPY{valore}{\num}` dove poi con \num si può chiamare il valore. Dal momento che i dati sono di tipi diversi ho bisogno che le variabili a cui vengono inizializzati i valori siano diversi, e per questo necessito quanto scritto sopra.
Grazie a tutti
OldClaudio” post=113194`\newcommand{\comand}[1]{\char92comando\{#2\}}`
Qualunque cosa tu voglia fare con questo \comando, mi sembra una cosa un po’ strana; puoi giocare con la definizione che ti ho scritto, magari componendo il tutto come argomento di \texttt; ma se non spieghi meglio quanto ti ho scritto fa così: se nel documento .tex scrivi [tt]\comando{pippo}[/tt], nel documento pdf ti esce esattamante la stessa cosa scritta nel font corrente “\comando{pippo}”; se aggiungi \texttt, ti viene scritto nel documento pdf “[tt]\comando{pippo}[/tt]”.
-
8 Aprile 2018 alle 6:07 #112846
-
8 Aprile 2018 alle 7:58 #112847::
Sì, direi che senz’altro ciò di cui sei in cerca è il costrutto [tt]\csname …\endcsname[/tt], il quale permette di costruire un comando at run-time; se si preferisce, è il meccanismo con il quale il TeX realizza l’indirezione nei comandi. Il nucleo del LaTeX rende disponibile la stessa funzione tramite la macro [tt]\@nameuse[/tt].Esempio minimo compilabile:
`
% My standard header for TeX.SX answers:
\documentclass[a4paper]{article} % To avoid confusion, let us explicitly
% declare the paper format.\usepackage[T1]{fontenc} % Not always necessary, but recommended.
% End of standard header. What follows pertains to the problem at hand.\newcommand*{\comando}[1]{\csname comando#1\endcsname}
% % Definizione alternativa:
% \makeatletter
% \newcommand*\comando[1]{\@nameuse{comando#1}}
% \makeatother\newcommand*{\comandoA}{Pippo}
\newcommand*{\comandoB}{Pluto}
\newcommand*{\comandoC}{Paperino}\begin{document}
\comando{A}, \comando{B} e \comando{C}.
\end{document}
`Se poi vuoi anche definire un comando con (parte de) il nome variabile, devi anche imparare l’uso di [tt]\expandafter[/tt] :smile:, oppure usare [tt]\@namedef[/tt].
Ciao.
—
Gustavo
-
8 Aprile 2018 alle 10:32 #112848::
Grazie!
Potresti fornirmi anche un esempio di caso con parte del nome variabile?Matteo
letteracdp” post=113200Sì, direi che senz’altro ciò di cui sei in cerca è il costrutto [tt]\csname …\endcsname[/tt], il quale permette di costruire un comando at run-time; se si preferisce, è il meccanismo con il quale il TeX realizza l’indirezione nei comandi. Il nucleo del LaTeX rende disponibile la stessa funzione tramite la macro [tt]\@nameuse[/tt].
Esempio minimo compilabile:
`
% My standard header for TeX.SX answers:
\documentclass[a4paper]{article} % To avoid confusion, let us explicitly
% declare the paper format.\usepackage[T1]{fontenc} % Not always necessary, but recommended.
% End of standard header. What follows pertains to the problem at hand.\newcommand*{\comando}[1]{\csname comando#1\endcsname}
% % Definizione alternativa:
% \makeatletter
% \newcommand*\comando[1]{\@nameuse{comando#1}}
% \makeatother\newcommand*{\comandoA}{Pippo}
\newcommand*{\comandoB}{Pluto}
\newcommand*{\comandoC}{Paperino}\begin{document}
\comando{A}, \comando{B} e \comando{C}.
\end{document}
`Se poi vuoi anche definire un comando con (parte de) il nome variabile, devi anche imparare l’uso di [tt]\expandafter[/tt] :smile:, oppure usare [tt]\@namedef[/tt].
Ciao.
—
Gustavo -
8 Aprile 2018 alle 11:21 #112849::
Intanto \@nameuse usa la stessa sequenza che ho usato io, quindi se vuoi pupi usare questo`\makeatletter
\@namedef{comandopippo}{\emph{Pippo}}
\newcommand\*comando[1]{\@nameuse{comando#1}}`
Se nel documento .tex scrivi \comando{pippo} nel nel documento composto vien scritto Pippo.Era questo che volevi fare?
-
8 Aprile 2018 alle 16:24 #112850::
Non proprio, io vorrei che il risultato fosse:
\comando#partevariabile
dove poi \comando#partevariabile viene considerato un comando valido nel testo…OldClaudio” post=113203Intanto \@nameuse usa la stessa sequenza che ho usato io, quindi se vuoi pupi usare questo`\makeatletter
\@namedef{comandopippo}{\emph{Pippo}}
\newcommand\*comando[1]{\@nameuse{comando#1}}`
Se nel documento .tex scrivi \comando{pippo} nel nel documento composto vien scritto Pippo.Era questo che volevi fare?
-
8 Aprile 2018 alle 19:46 #112851
-
9 Aprile 2018 alle 21:24 #112852::
È colpa mia, che ho risposto frettolosamente e — lo ammetto! — senza leggere affatto la tua replica alla prima risposta di @OldClaudio, nella quale delineavi lo scenario di utilizzo che sottostà al tuo problema: non bisognerebbe mai fare così, e mi scuso per averlo fatto. 😳Le macro [tt]\@nameuse[/tt] e [tt]\@namedef[/tt] vanno bene per essere usate da sole, ma, in generale, non possono essere usate per “fabbricare” nomi di comandi che debbano essere passati come argomenti ad altri comandi. Quello che vuoi fare tu è complicato, e vedo tre modi per farlo, l’ultimo dei quali vira alquanto sul tacón (nel senso @egreg9-iano del termine):
- studiare l’implementazione del pacchetto calculator e implementare il comportamento desiderato direttamente al suo interno, modificandone il codice;
- imparare il LaTeX3 😉 ;
- pre-processare gli argomenti da passare ai comandi del pacchetto calculator mediante i vecchi trucchi di basso livello a base di [tt]\edef[/tt], [tt]\expandafter[/tt], [tt]\noxepand[/tt] e [tt]\unexpanded[/tt].
Vediamo come potrebbe essere realizzato il punto 3, limitandoci a una proof of concept. Il codice seguente definisce tre macro che consentono di richiamare un dato comando, il quale si aspetta che certi suoi argomenti siano dei nomi di comando (più esattamente, delle sequenze di controllo), costruendo tali nomi a partire da altrettante sequenze di caratteri passate in argomenti corrispondenti per posizione. Per esempio, nel codice che segue, le linee
`
\COPYinVarName{357}{dividendo}
\INTEGERDIVISIONwithVarDividendVarQuotientVarRemainder
{dividendo}{12}{quoziente}{resto}
`
generano le due chiamate
`
\COPY{357}{\dividendo}
\INTEGERDIVISION{\dividendo}{12}{\quoziente}{\resto}
`
L’esempio in questione utilizza la primitiva [tt]\unexpanded[/tt], che non fa parte del «TeX di Knuth», sebbene sia disponibile da parecchi anni nella variante di TeX di più comune utilizzo, cioè pdf(e)TeX. In teoria, si potrebbe ottenere un comportamento equipollente anche col puro TeX knuthiano, utilizzando la primitiva [tt]\the[/tt] applicata a un token register: si forniscono due esempi, per il momento commentati, di implementazioni alternative mediante questa tecnica, che potrai sperimentare decommentandole (e commentando, naturalmente, le corrispondenti implementazioni tramite [tt]\unexpanded[/tt]).`
% My standard header for TeX.SX answers:
\documentclass[a4paper]{article} % To avoid confusion, let us explicitly
% declare the paper format.\usepackage[T1]{fontenc} % Not always necessary, but recommended.
% End of standard header. What follows pertains to the problem at hand.\usepackage[italian]{babel}
\usepackage{calculator}\makeatletter
%
% Implementation with e-TeX's “\unexpanded”:
\newcommand*\MakeCSFromSecondArgument[2]{%
\edef\@tempa{%
\unexpanded{#1}%
\expandafter\noexpand \csname #2\endcsname
}%
\@tempa
}
% %
% % “Purely Knuthian” implementation:
% \newcommand*\MakeCSFromSecondArgument[2]{%
% \toks@ {#1}%
% \expandafter\the \expandafter\toks@
% \csname #2\endcsname
% }%
% Implementation with e-TeX's “\unexpanded”:
\newcommand*\MakeCSFromSecondAndThirdArgument[3]{%
\edef\@tempa{%
\unexpanded{#1}%
\expandafter\noexpand \csname #2\endcsname
\expandafter\noexpand \csname #3\endcsname
}%
\@tempa
}
% %
% % “Purely Knuthian” implementation:
% \newcommand*\MakeCSFromSecondAndThirdArgument[3]{%
% \toks@ {#1}%
% \expandafter\the \expandafter\toks@
% \csname #2\expandafter\endcsname
% \csname #3\endcsname
% }%
% Implementation with e-TeX's “\unexpanded”:
\newcommand*\MakeCSFromSecondFourthAndFifthArgument[5]{%
\edef\@tempa{%
\unexpanded{#1}%
{\expandafter\noexpand \csname #2\endcsname}%
\unexpanded{#3}%
\expandafter\noexpand \csname #4\endcsname
\expandafter\noexpand \csname #5\endcsname
}%
\@tempa
}
%
% No “purely Knuthian” version fot this one!\makeatother
\newcommand*{\COPYinVarName}[2]{%
\MakeCSFromSecondArgument{\COPY{#1}}{#2}%
}
\newcommand*{\INTEGERDIVISIONwithVarQuotientVarRemainder}[4]{%
\MakeCSFromSecondAndThirdArgument
{\INTEGERDIVISION{#1}{#2}}%
{#3}{#4}% variable names
}
\newcommand*{\INTEGERDIVISIONwithVarDividendVarQuotientVarRemainder}[4]{%
\MakeCSFromSecondFourthAndFifthArgument
\INTEGERDIVISION
{#1}% variable name
{{#2}}%
{#3}{#4}% variable names
}\begin{document}
\COPYinVarName{33.333}{pippo}
Ora \( \verb|\pippo| = \pippo \).
\COPYinVarName{-12.345}{pippo}
Adesso, per\`{o}, \( \verb|\pippo| = \pippo \).
\INTEGERDIVISIONwithVarQuotientVarRemainder{38}{5}{quoziente}{resto}
Il quoziente di $138$ diviso~$15$ \`{e} $\quoziente$ con resto~$\resto$
perch\'{e}
\[
\quoziente \times 15 + \resto = 138
\]\INTEGERDIVISIONwithVarQuotientVarRemainder{187}{17}{quoziente}{resto}
Il quoziente di $187$ diviso~$17$ \`{e} $\quoziente$ con resto~$\resto$
perch\'{e}
\[
\quoziente \times 17 + \resto = 187
\]\COPYinVarName{357}{dividendo}
\INTEGERDIVISIONwithVarDividendVarQuotientVarRemainder
{dividendo}{12}{quoziente}{resto}Il quoziente di $\dividendo$ diviso~$12$ \`{e} $\quoziente$ con resto~$\resto$
perch\'{e}
\[
\quoziente \times 12 + \resto = \dividendo
\]\end{document}
`Permettetemi di chiudere con una nota mestamente nostalgica per gli arditi [tt]\edef[/tt], le delicate collanine di [tt]\expandafter[/tt], fragili e iridescenti come trine di brina, le espansioni controllate dei [tt]\the[/tt] applicati a un token register, gli ossimorici [tt]\expandafter\noexpand[/tt]… Tutte cose che, con il LaTeX3, sono destinate a scomparire… 😥
Ciao.
—
Gustavo
-
10 Aprile 2018 alle 3:10 #112853::
Grazie mille, stasera o domani mattina al più presto ci guardo dietro, grazie davveroletteracdp” post=113219È colpa mia, che ho risposto frettolosamente e — lo ammetto! — senza leggere affatto la tua replica alla prima risposta di @OldClaudio, nella quale delineavi lo scenario di utilizzo che sottostà al tuo problema: non bisognerebbe mai fare così, e mi scuso per averlo fatto. 😳
Le macro [tt]\@nameuse[/tt] e [tt]\@namedef[/tt] vanno bene per essere usate da sole, ma, in generale, non possono essere usate per “fabbricare” nomi di comandi che debbano essere passati come argomenti ad altri comandi. Quello che vuoi fare tu è complicato, e vedo tre modi per farlo, l’ultimo dei quali vira alquanto sul tacón (nel senso @egreg9-iano del termine):
- studiare l’implementazione del pacchetto calculator e implementare il comportamento desiderato direttamente al suo interno, modificandone il codice;
- imparare il LaTeX3 😉 ;
- pre-processare gli argomenti da passare ai comandi del pacchetto calculator mediante i vecchi trucchi di basso livello a base di [tt]\edef[/tt], [tt]\expandafter[/tt], [tt]\noxepand[/tt] e [tt]\unexpanded[/tt].
Vediamo come potrebbe essere realizzato il punto 3, limitandoci a una proof of concept. Il codice seguente definisce tre macro che consentono di richiamare un dato comando, il quale si aspetta che certi suoi argomenti siano dei nomi di comando (più esattamente, delle sequenze di controllo), costruendo tali nomi a partire da altrettante sequenze di caratteri passate in argomenti corrispondenti per posizione. Per esempio, nel codice che segue, le linee
`
\COPYinVarName{357}{dividendo}
\INTEGERDIVISIONwithVarDividendVarQuotientVarRemainder
{dividendo}{12}{quoziente}{resto}
`
generano le due chiamate
`
\COPY{357}{\dividendo}
\INTEGERDIVISION{\dividendo}{12}{\quoziente}{\resto}
`
L’esempio in questione utilizza la primitiva [tt]\unexpanded[/tt], che non fa parte del «TeX di Knuth», sebbene sia disponibile da parecchi anni nella variante di TeX di più comune utilizzo, cioè pdf(e)TeX. In teoria, si potrebbe ottenere un comportamento equipollente anche col puro TeX knuthiano, utilizzando la primitiva [tt]\the[/tt] applicata a un token register: si forniscono due esempi, per il momento commentati, di implementazioni alternative mediante questa tecnica, che potrai sperimentare decommentandole (e commentando, naturalmente, le corrispondenti implementazioni tramite [tt]\unexpanded[/tt]).`
% My standard header for TeX.SX answers:
\documentclass[a4paper]{article} % To avoid confusion, let us explicitly
% declare the paper format.\usepackage[T1]{fontenc} % Not always necessary, but recommended.
% End of standard header. What follows pertains to the problem at hand.\usepackage[italian]{babel}
\usepackage{calculator}\makeatletter
%
% Implementation with e-TeX's “\unexpanded”:
\newcommand*\MakeCSFromSecondArgument[2]{%
\edef\@tempa{%
\unexpanded{#1}%
\expandafter\noexpand \csname #2\endcsname
}%
\@tempa
}
% %
% % “Purely Knuthian” implementation:
% \newcommand*\MakeCSFromSecondArgument[2]{%
% \toks@ {#1}%
% \expandafter\the \expandafter\toks@
% \csname #2\endcsname
% }%
% Implementation with e-TeX's “\unexpanded”:
\newcommand*\MakeCSFromSecondAndThirdArgument[3]{%
\edef\@tempa{%
\unexpanded{#1}%
\expandafter\noexpand \csname #2\endcsname
\expandafter\noexpand \csname #3\endcsname
}%
\@tempa
}
% %
% % “Purely Knuthian” implementation:
% \newcommand*\MakeCSFromSecondAndThirdArgument[3]{%
% \toks@ {#1}%
% \expandafter\the \expandafter\toks@
% \csname #2\expandafter\endcsname
% \csname #3\endcsname
% }%
% Implementation with e-TeX's “\unexpanded”:
\newcommand*\MakeCSFromSecondFourthAndFifthArgument[5]{%
\edef\@tempa{%
\unexpanded{#1}%
{\expandafter\noexpand \csname #2\endcsname}%
\unexpanded{#3}%
\expandafter\noexpand \csname #4\endcsname
\expandafter\noexpand \csname #5\endcsname
}%
\@tempa
}
%
% No “purely Knuthian” version fot this one!\makeatother
\newcommand*{\COPYinVarName}[2]{%
\MakeCSFromSecondArgument{\COPY{#1}}{#2}%
}
\newcommand*{\INTEGERDIVISIONwithVarQuotientVarRemainder}[4]{%
\MakeCSFromSecondAndThirdArgument
{\INTEGERDIVISION{#1}{#2}}%
{#3}{#4}% variable names
}
\newcommand*{\INTEGERDIVISIONwithVarDividendVarQuotientVarRemainder}[4]{%
\MakeCSFromSecondFourthAndFifthArgument
\INTEGERDIVISION
{#1}% variable name
{{#2}}%
{#3}{#4}% variable names
}\begin{document}
\COPYinVarName{33.333}{pippo}
Ora \( \verb|\pippo| = \pippo \).
\COPYinVarName{-12.345}{pippo}
Adesso, per\`{o}, \( \verb|\pippo| = \pippo \).
\INTEGERDIVISIONwithVarQuotientVarRemainder{38}{5}{quoziente}{resto}
Il quoziente di $138$ diviso~$15$ \`{e} $\quoziente$ con resto~$\resto$
perch\'{e}
\[
\quoziente \times 15 + \resto = 138
\]\INTEGERDIVISIONwithVarQuotientVarRemainder{187}{17}{quoziente}{resto}
Il quoziente di $187$ diviso~$17$ \`{e} $\quoziente$ con resto~$\resto$
perch\'{e}
\[
\quoziente \times 17 + \resto = 187
\]\COPYinVarName{357}{dividendo}
\INTEGERDIVISIONwithVarDividendVarQuotientVarRemainder
{dividendo}{12}{quoziente}{resto}Il quoziente di $\dividendo$ diviso~$12$ \`{e} $\quoziente$ con resto~$\resto$
perch\'{e}
\[
\quoziente \times 12 + \resto = \dividendo
\]\end{document}
`Permettetemi di chiudere con una nota mestamente nostalgica per gli arditi [tt]\edef[/tt], le delicate collanine di [tt]\expandafter[/tt], fragili e iridescenti come trine di brina, le espansioni controllate dei [tt]\the[/tt] applicati a un token register, gli ossimorici [tt]\expandafter\noexpand[/tt]… Tutte cose che, con il LaTeX3, sono destinate a scomparire… 😥
Ciao.
—
Gustavo -
10 Aprile 2018 alle 6:24 #112854
-
10 Aprile 2018 alle 17:26 #112855::
Ciao, scusate se chiedo ancora, ma la sintassi per definire `\newcommand*\MakeCSFromSecondFourthAndFifthArgument[5]` e collega, e mi farebbe molto comodo avere anche quello per fare la somma di due “variabili” a cui è già stato assegnato un valore tramite `\COPYinVarName`Molte grazie
letteracdp” post=113219È colpa mia, che ho risposto frettolosamente e — lo ammetto! — senza leggere affatto la tua replica alla prima risposta di @OldClaudio, nella quale delineavi lo scenario di utilizzo che sottostà al tuo problema: non bisognerebbe mai fare così, e mi scuso per averlo fatto. 😳
Le macro [tt]\@nameuse[/tt] e [tt]\@namedef[/tt] vanno bene per essere usate da sole, ma, in generale, non possono essere usate per “fabbricare” nomi di comandi che debbano essere passati come argomenti ad altri comandi. Quello che vuoi fare tu è complicato, e vedo tre modi per farlo, l’ultimo dei quali vira alquanto sul tacón (nel senso @egreg9-iano del termine):
- studiare l’implementazione del pacchetto calculator e implementare il comportamento desiderato direttamente al suo interno, modificandone il codice;
- imparare il LaTeX3 😉 ;
- pre-processare gli argomenti da passare ai comandi del pacchetto calculator mediante i vecchi trucchi di basso livello a base di [tt]\edef[/tt], [tt]\expandafter[/tt], [tt]\noxepand[/tt] e [tt]\unexpanded[/tt].
Vediamo come potrebbe essere realizzato il punto 3, limitandoci a una proof of concept. Il codice seguente definisce tre macro che consentono di richiamare un dato comando, il quale si aspetta che certi suoi argomenti siano dei nomi di comando (più esattamente, delle sequenze di controllo), costruendo tali nomi a partire da altrettante sequenze di caratteri passate in argomenti corrispondenti per posizione. Per esempio, nel codice che segue, le linee
`
\COPYinVarName{357}{dividendo}
\INTEGERDIVISIONwithVarDividendVarQuotientVarRemainder
{dividendo}{12}{quoziente}{resto}
`
generano le due chiamate
`
\COPY{357}{\dividendo}
\INTEGERDIVISION{\dividendo}{12}{\quoziente}{\resto}
`
L’esempio in questione utilizza la primitiva [tt]\unexpanded[/tt], che non fa parte del «TeX di Knuth», sebbene sia disponibile da parecchi anni nella variante di TeX di più comune utilizzo, cioè pdf(e)TeX. In teoria, si potrebbe ottenere un comportamento equipollente anche col puro TeX knuthiano, utilizzando la primitiva [tt]\the[/tt] applicata a un token register: si forniscono due esempi, per il momento commentati, di implementazioni alternative mediante questa tecnica, che potrai sperimentare decommentandole (e commentando, naturalmente, le corrispondenti implementazioni tramite [tt]\unexpanded[/tt]).`
% My standard header for TeX.SX answers:
\documentclass[a4paper]{article} % To avoid confusion, let us explicitly
% declare the paper format.\usepackage[T1]{fontenc} % Not always necessary, but recommended.
% End of standard header. What follows pertains to the problem at hand.\usepackage[italian]{babel}
\usepackage{calculator}\makeatletter
%
% Implementation with e-TeX's “\unexpanded”:
\newcommand*\MakeCSFromSecondArgument[2]{%
\edef\@tempa{%
\unexpanded{#1}%
\expandafter\noexpand \csname #2\endcsname
}%
\@tempa
}
% %
% % “Purely Knuthian” implementation:
% \newcommand*\MakeCSFromSecondArgument[2]{%
% \toks@ {#1}%
% \expandafter\the \expandafter\toks@
% \csname #2\endcsname
% }%
% Implementation with e-TeX's “\unexpanded”:
\newcommand*\MakeCSFromSecondAndThirdArgument[3]{%
\edef\@tempa{%
\unexpanded{#1}%
\expandafter\noexpand \csname #2\endcsname
\expandafter\noexpand \csname #3\endcsname
}%
\@tempa
}
% %
% % “Purely Knuthian” implementation:
% \newcommand*\MakeCSFromSecondAndThirdArgument[3]{%
% \toks@ {#1}%
% \expandafter\the \expandafter\toks@
% \csname #2\expandafter\endcsname
% \csname #3\endcsname
% }%
% Implementation with e-TeX's “\unexpanded”:
\newcommand*\MakeCSFromSecondFourthAndFifthArgument[5]{%
\edef\@tempa{%
\unexpanded{#1}%
{\expandafter\noexpand \csname #2\endcsname}%
\unexpanded{#3}%
\expandafter\noexpand \csname #4\endcsname
\expandafter\noexpand \csname #5\endcsname
}%
\@tempa
}
%
% No “purely Knuthian” version fot this one!\makeatother
\newcommand*{\COPYinVarName}[2]{%
\MakeCSFromSecondArgument{\COPY{#1}}{#2}%
}
\newcommand*{\INTEGERDIVISIONwithVarQuotientVarRemainder}[4]{%
\MakeCSFromSecondAndThirdArgument
{\INTEGERDIVISION{#1}{#2}}%
{#3}{#4}% variable names
}
\newcommand*{\INTEGERDIVISIONwithVarDividendVarQuotientVarRemainder}[4]{%
\MakeCSFromSecondFourthAndFifthArgument
\INTEGERDIVISION
{#1}% variable name
{{#2}}%
{#3}{#4}% variable names
}\begin{document}
\COPYinVarName{33.333}{pippo}
Ora \( \verb|\pippo| = \pippo \).
\COPYinVarName{-12.345}{pippo}
Adesso, per\`{o}, \( \verb|\pippo| = \pippo \).
\INTEGERDIVISIONwithVarQuotientVarRemainder{38}{5}{quoziente}{resto}
Il quoziente di $138$ diviso~$15$ \`{e} $\quoziente$ con resto~$\resto$
perch\'{e}
\[
\quoziente \times 15 + \resto = 138
\]\INTEGERDIVISIONwithVarQuotientVarRemainder{187}{17}{quoziente}{resto}
Il quoziente di $187$ diviso~$17$ \`{e} $\quoziente$ con resto~$\resto$
perch\'{e}
\[
\quoziente \times 17 + \resto = 187
\]\COPYinVarName{357}{dividendo}
\INTEGERDIVISIONwithVarDividendVarQuotientVarRemainder
{dividendo}{12}{quoziente}{resto}Il quoziente di $\dividendo$ diviso~$12$ \`{e} $\quoziente$ con resto~$\resto$
perch\'{e}
\[
\quoziente \times 12 + \resto = \dividendo
\]\end{document}
`Permettetemi di chiudere con una nota mestamente nostalgica per gli arditi [tt]\edef[/tt], le delicate collanine di [tt]\expandafter[/tt], fragili e iridescenti come trine di brina, le espansioni controllate dei [tt]\the[/tt] applicati a un token register, gli ossimorici [tt]\expandafter\noexpand[/tt]… Tutte cose che, con il LaTeX3, sono destinate a scomparire… 😥
Ciao.
—
Gustavo -
15 Aprile 2018 alle 11:08 #112856
-
15 Aprile 2018 alle 21:07 #112857::
Matteo Dann” post=113241Ciao, scusate se chiedo ancora, ma la sintassi per definire `\newcommand*\MakeCSFromSecondFourthAndFifthArgument[5]` e collega, e mi farebbe molto comodo avere anche quello per fare la somma di due “variabili” a cui è già stato assegnato un valore tramite `\COPYinVarName`
[…]Chiedo scusa se rispondo molto di fretta, in compenso ho incluso dei commenti nel codice che spero sufficienti a illustrare l’uso delle macro che propongo. Ho riorganizzato la preelaborazione degli argomenti in modo molto più ordinato, ora si può scrivere qualcosa del tipo
`
\newcommand*{\COPYinVarName}[2]{%
\PreProcessArguments{\COPY}{%
\PassArgumentAsIs{#1}%
\MakeCSFromString{#2}%
}%
}
`
dove si usa [tt]\PassArgumentAsIs{#[/tt]i[tt]}[/tt] se si vuole passare l’i-esimo argomento inalterato, [tt]\MakeCSFromString{#[/tt]i[tt]}[/tt] se l’i-esimo argomento deve essere trasformato da stringa a nome di comando.Esempio compilabile:
`
% My standard header for TeX.SX answers:
\documentclass[a4paper]{article} % To avoid confusion, let us explicitly
% declare the paper format.\usepackage[T1]{fontenc} % Not always necessary, but recommended.
% End of standard header. What follows pertains to the problem at hand.\usepackage[italian]{babel}
\usepackage{calculator}\makeatletter
% Suppose you have a command “\COMM” (e.g., “\COMM” = “\COPY”), with
% n arguments; suppose some of these argument must be command names,
% and that you want to define a variant of “\COMM”, named “\MYCOMM”,
% that builds some of those command names from strings of characters
% passed in corresponding arguments of “\MYCOMM”. For example,
% let's say that you want
%
% \MYCOMM{dividend}{13}{quotient}{\remainder}
%
% (note that the last argument is already a command name, and not a
% string from which a command name should be built) to have the same
% outcome as
%
% \COMM{\dividend}{13}{\quotient}{\remainder}
%
% The following macros help you do so.
%
% – \PreProcessArguments{<\COMM>}{- }
% The first argument is the original command you want to invoke.
% The second argument contains a sequence of items of the form
%{#i}
% (one for each argument of <\COMM>), whereis either
% “\PassArgumentAsIs” or “\MakeCSFromString”, and i is the number
% of the item (that is, of the argument the item describes); this
% sequence specifes how each argument of the command you are defining
% should be forwarded to <\COMM>, the names of the two wrappers being
% self-explanatory.
%
% IMPORTANT: it is also possible, when using “\MakeCSFromString”,
% to add a costant prefix (or a suffix, or both) to the given string
% before it is converted to a command name: see example below.\newcommand*\PreProcessArguments[2]{%
\edef\@tempa{\noexpand#1#2}%
% \show\@tempa % diagnostic message, disabled by default
\@tempa
}
\newcommand*\PassArgumentAsIs[1]{{\unexpanded{#1}}}
\newcommand*\MakeCSFromString[1]{%
\expandafter\noexpand \csname #1\endcsname
}\makeatother
% \COPYinVarName{123}{duck} -> \COPY{123}{\duck}
% ^ ^
% | |
% pass argument “as is” ——-+ |
% make comm. name from string ——+
\newcommand*{\COPYinVarName}[2]{%
\PreProcessArguments{\COPY}{%
\PassArgumentAsIs{#1}%
\MakeCSFromString{#2}%
}%
}% \INTEGERDIVISIONwithVarQuotientVarRemainder{987}{654}{aa}{bb}
% -> \INTEGERDIVISION{987}{654}{\aa}{\bb}
% ^ ^ ^ ^
% | | | |
% pass argument “as is” ——-+ | | |
% pass argument “as is” ————+ | |
% make comm. name from string ———–+ |
% make comm. name from string —————-+
\newcommand*{\INTEGERDIVISIONwithVarQuotientVarRemainder}[4]{%
\PreProcessArguments{\INTEGERDIVISION}{%
\PassArgumentAsIs{#1}%
\PassArgumentAsIs{#2}%
\MakeCSFromString{#3}%
\MakeCSFromString{#4}%
}%
}% \INTEGERDIVISIONwithVarDividendVarQuotientVarRemainder{aa}{654}{bb}{cc}
% -> \INTEGERDIVISION{\aa}{654}{\bb}{\cc}
% ^ ^ ^ ^
% | | | |
% make comm. name from string -+ | | |
% pass argument “as is” ————+ | |
% make comm. name from string ———–+ |
% make comm. name from string —————-+
\newcommand*{\INTEGERDIVISIONwithVarDividendVarQuotientVarRemainder}[4]{%
\PreProcessArguments{\INTEGERDIVISION}{%
\MakeCSFromString{#1}%
\PassArgumentAsIs{#2}%
\MakeCSFromString{#3}%
\MakeCSFromString{#4}%
}%
}% Etc. etc.
\newcommand*{\INTEGERDIVISIONwithVarDividendVarQuotient}[4]{%
\PreProcessArguments{\INTEGERDIVISION}{%
\MakeCSFromString{#1}%
\PassArgumentAsIs{#2}%
\MakeCSFromString{#3}%
\PassArgumentAsIs{#4}%
}%
}% An example where a constant prefix/suffix are added:
\newcommand*{\INTEGERDIVISIONwithVarDividendVarQuotientAdorned}[4]{%
\PreProcessArguments{\INTEGERDIVISION}{%
\MakeCSFromString{#1}%
\PassArgumentAsIs{#2}%
\MakeCSFromString{A#3Z}%
\PassArgumentAsIs{#4}%
}%
}\begin{document}
\COPYinVarName{33.333}{pippo}
Ora \( \verb|\pippo| = \pippo \).
\COPYinVarName{-12.345}{pippo}
Adesso, per\`{o}, \( \verb|\pippo| = \pippo \).
\INTEGERDIVISIONwithVarQuotientVarRemainder{38}{5}{quoziente}{resto}
Il quoziente di $138$ diviso~$15$ \`{e} $\quoziente$ con resto~$\resto$
perch\'{e}
\[
\quoziente \times 15 + \resto = 138
\]\INTEGERDIVISIONwithVarQuotientVarRemainder{187}{17}{quoziente}{resto}
Il quoziente di $187$ diviso~$17$ \`{e} $\quoziente$ con resto~$\resto$
perch\'{e}
\[
\quoziente \times 17 + \resto = 187
\]\COPYinVarName{357}{dividendo}
\INTEGERDIVISIONwithVarDividendVarQuotientVarRemainder
{dividendo}{12}{quoziente}{resto}Il quoziente di $\dividendo$ diviso~$12$ \`{e} $\quoziente$ con resto~$\resto$
perch\'{e}
\[
\quoziente \times 12 + \resto = \dividendo
\]\COPYinVarName{10}{divisore}
\INTEGERDIVISIONwithVarDividendVarQuotient
{dividendo}{\divisore}{quoziente}{\resto}Il quoziente di $\dividendo$ diviso~$\divisore$ \`{e} $\quoziente$ con resto~$\resto$
perch\'{e}
\[
\quoziente \times \divisore + \resto = \dividendo
\]
Quest'ultimo esempio mostra chiaramente che \verb|\PassArgumentAsIs| funziona
anche se l'argomento da passare <> \`{e} il nome di un
comando.\INTEGERDIVISIONwithVarDividendVarQuotientAdorned
{dividendo}{\divisore}{quoziente}{\resto}Con pre-\slash suffisso: il quoziente di $\dividendo$ diviso~$\divisore$ \`{e}
$\AquozienteZ$ con resto~$\resto$ perch\'{e}
\[
\AquozienteZ \times \divisore + \resto = \dividendo
\]\end{document}
`Ciao.
—
Gustavo
-
16 Aprile 2018 alle 10:12 #112858::
Meraviglioso grazie mille, se ora volessi far funzionare un comando simile dentro un altro comando, come potrei fare? Io ho provato con`\newcommand{\inizializza}[1]{%
\PreProcessArguments{\COPYinVarName}{%
\MakeCSFromString{0}
\MakeCSFromString{totale#1}%
}%
}`
ma non funziona… (Qui sarebbe per “inizializzare” un valore a zero)
-
16 Aprile 2018 alle 14:42 #112859::
Matteo Dann” post=113307Meraviglioso grazie mille, se ora volessi far funzionare un comando simile dentro un altro comando, come potrei fare? Io ho provato con`\newcommand{\inizializza}[1]{%
\PreProcessArguments{\COPYinVarName}{%
\MakeCSFromString{0}
\MakeCSFromString{totale#1}%
}%
}`
ma non funziona… (Qui sarebbe per “inizializzare” un valore a zero)Stai sbagliando due cose:
- nel primo argomento di [tt]\PreProcessArguments[/tt] devi passare il comando del pacchetto calculator sul quale il tuo comando è basato;
- tu vuoi passare la costante zero «così com’è», dunque devi usare come «inviluppo» [tt]\PassArgumentAsIs[/tt], non [tt]\MakeCSFromString[/tt].
Dunque scriverai:
`
\newcommand*{\inizializza}[1]{%
\PreProcessArguments{\COPY}{%
\PassArgumentAsIs{0}%
\MakeCSFromString{totale#1}%
}%
}
`
Ecco un esempio completo e compilabile:
`
% My standard header for TeX.SX answers:
\documentclass[a4paper]{article} % To avoid confusion, let us explicitly
% declare the paper format.\usepackage[T1]{fontenc} % Not always necessary, but recommended.
% End of standard header. What follows pertains to the problem at hand.\usepackage[italian]{babel}
\usepackage{calculator}\makeatletter
\newcommand*\PreProcessArguments[2]{%
\edef\@tempa{\noexpand#1#2}%
% \show\@tempa % diagnostic message, disabled by default
\@tempa
}
\newcommand*\PassArgumentAsIs[1]{{\unexpanded{#1}}}
\newcommand*\MakeCSFromString[1]{%
\expandafter\noexpand \csname #1\endcsname
}\makeatother
\newcommand*{\inizializza}[1]{%
\PreProcessArguments{\COPY}{%
\PassArgumentAsIs{0}%
\MakeCSFromString{totale#1}%
}%
}\begin{document}
\COPY{123}{\totalePippo}
Qui \( \verb|\totalePippo| = \totalePippo \).
\inizializza{Pippo}
Ora, per\`{o}, \( \verb|\totalePippo| = \totalePippo \).
\end{document}
`Ciao.
—
Gustavo
-
16 Aprile 2018 alle 17:04 #112860::
Oh, naturalmente funziona anche
`
\newcommand*{\inizializza}[1]{\COPYinVarName{0}{totale#1}}
`
con la definizione di [tt]\COPYinVarName[/tt] sempre data da
`
\newcommand*{\COPYinVarName}[2]{%
\PreProcessArguments{\COPY}{%
\PassArgumentAsIs{#1}%
\MakeCSFromString{#2}%
}%
}
`
Ciao.—
Gustavo
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.