2010-06-01 10 views
5

Invece di fare una macro per ogni lettera, come inmodo rapido per fare 26 macro (uno per ogni lettera)

\def\bA{\mathbf{A}} 
... 
\def\bZ{\mathbf{Z}} 

c'è un modo per ciclare su una classe di caratteri (come le lettere maiuscole) e generare macro per ciascuno? Mi piacerebbe anche fare lo stesso per le lettere greche (usando bm invece di mathbf).

+0

A proposito, sto cercando una risposta (La) Tex. Attualmente ho uno script bash, ma voglio una soluzione (La) solo per TeX. – Geoff

+1

Non conosco Latex, quindi aggiungo questo come commento: esiste un costrutto di script all'interno di qualsiasi cosa tu stia usando per generare i macro?e se è così, ha la capacità di chiamare qualcosa all'effetto di 'echo -e -n' \ x41''. Incrementando il numero '41' si passa attraverso tutte le lettere ascii dell'alfabeto (a partire dal maiuscolo 'A'). – aronchick

+0

@aronchick - Questa è l'idea. La risposta di Andrews qui sotto (ma in TeX ci riferiamo direttamente ai caratteri alfabetici, evitando gli ascii). – Geoff

risposta

6
\def\mydefb#1{\expandafter\def\csname b#1\endcsname{\mathbf{#1}}} 
\def\mydefallb#1{\ifx#1\mydefallb\else\mydefb#1\expandafter\mydefallb\fi} 
\mydefallb ABCDEFGHIJKLMNOPQRSTUVWXYZ\mydefallb 

Nuovo per il greco

\def\mydefgreek#1{\expandafter\def\csname b#1\endcsname{\text{\boldmath$\mathbf{\csname #1\endcsname}$}}} 
\def\mydefallgreek#1{\ifx\mydefallgreek#1\else\mydefgreek{#1}% 
    \lowercase{\mydefgreek{#1}}\expandafter\mydefallgreek\fi} 
\mydefallgreek {beta}{Gamma}{Delta}{epsilon}{etaex}{Theta}{Iota}{Lambda}{kappa}{mu}{nu}{Xi}{Pi}{rho}\mydefallgreek 


$\bGamma\bDelta \bTheta \bLambda \bXi \bPi $ 

$\bbeta \bgamma\bdelta \bepsilon \betaex \btheta \biota \blambda \bkappa \bmu \bnu \bxi \bpi \brho$ 
+0

Questo è fantastico. Quindi la linea 2 è essenzialmente un ciclo perché si inserisce prima del prossimo carattere, giusto? La riga uno potrebbe essere inserita nella riga 2, ma è separata solo per la leggibilità. Una soluzione a due linee! L'unico lato negativo è dover digitare l'alfabeto. – Geoff

+0

Che ne dici di un elenco di lettere greche? ('{Gamma} {mu}' o '\ Gamma \ mu' o qualche altro elenco ragionevole.) – Geoff

+0

Non capisco come si desidera scrivere lettere greche. Scrivi '\ bA, \ bB', ecc. Per' A, B, ... '. Di cosa parla il greco? '\ BGamma'? '\ bmmu'? Non capisco. –

4

non sarebbe meglio definire un comando

\newcommand\bm[1]{\ensuremath{${\boldmath$#1$}}$} 

e può essere utilizzato sia in modalità text e modalità math. Uso:

\[\bm{F(x)}=\int\bm\delta(x)\ dx] 
\where \mb F is blah blah blah and \bm \delta is halb halb halb... 

Risultato:
F (x) = 'inegral delta (x)' dx
Dove F è bla bla bla e 'delta' è halb halb halb ...

I dollari esterni sono lì per lasciare la modalità matematica (romana) perché il comando \boldmath non ha alcun effetto in modalità matematica. Quelli interni tornano alla matematica (grassetto). tiranti supplementari (${\boldmath) assicura che \boldmath comando funziona solo con #1

Un altro vantaggio di questo codice sta testando nuovi comandi per l'esistenza di \bb e \bg. Quindi non è possibile arrestare facilmente i makros di LaTeX.

Spero che questo sia quello che stai cercando.

+0

se vuoi avere una macro appositamente progettata per le lettere greche e un'altra per le lettere latine puoi aggiungere '\ newcommand \ bl [1] {\ ensuremath {\ mathbf {# 1}}} ' in preambolo e usarlo . - Funzionerà solo per le lettere latine. – Crowley

+0

+1 Immagino che la mia domanda sia più accademica che pratica. Il tuo suggerimento è totalmente valido. Immagino che scrivere '\ b X' invece di' \ bX' non sia una distinzione molto grande. Tuttavia, il mio obiettivo originale è quello di evitare lo spazio. Il tuo punto riguardante il cestinare macro esistenti è particolarmente importante. Sarebbe un codice molto confuso per ridefinire '\ bf' per esempio. – Geoff

3

Suggerirei di fare:

\newcommand{\b}[1]{\mathbf{#1}} 

come dice Crowley, e simile per tutti gli altri alfabeti. Tuttavia, se si davvero vuole farlo utilizzando il codice LaTeX, ecco uno che sembra funzionare:

\documentclass{article} 
\usepackage{amssymb} 
\newcounter{char} 
\setcounter{char}{1} 

\loop\ifnum\value{char}<27 
\edef\c{\Alph{char}} 
\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\csname\expandafter\expandafter\expandafter b\expandafter\c\expandafter\endcsname\expandafter{\expandafter\mathbb\expandafter{\c}} 
\addtocounter{char}{1} 
\repeat 

\begin{document} 

\(\bZ\) 
\end{document} 

ho perso il conto di quante 'expandafter di ci sono in quella! Per ottenere lettere minuscole, sostituire Alph di alph.

+0

Potrebbe influire anche sulle lettere greche? E perché usare '\ bH ello \ bW orld', quando puoi usare' \ b Hello \ b World'? – Crowley

+0

+1 Soluzione fredda. Non ho mai saputo di '\ expandafter' o' csname'. Penso che l'utilizzo di quest'ultimo ti consentirebbe di ritagliare un po 'la tua macro. – Geoff

+0

@Crowley: mi mancava un po 'di lettere greche. Si potrebbe definire una versione di \ alph e \ Alph per le lettere greche. Overkill per un'applicazione, ma potrebbe essere utile altrove. Per quanto riguarda il secondo punto: sono completamente d'accordo e l'ho detto! Nei miei documenti, utilizzo (una variante della) soluzione. Nondimeno, la domanda di poter ricorrere all'alfabeto era abbastanza intrigante da pensare che avrei potuto provarci. Ho cercato di colpire un tono che mostrava che non lo avrei mai fatto in pratica. Dopo tutto, 18 expandafters potrebbero essere considerati solo una tabulazione eccessiva! –

6

Ampliando la risposta di Andrea, qui è una soluzione senza \expandafter:

\makeatletter 
\@tempcnta=\@ne 
\def\@nameedef#1{\expandafter\edef\csname #1\endcsname} 
\loop\ifnum\@tempcnta<27 
    \@nameedef{b\@Alph\@tempcnta}{\noexpand\mathbb{\@Alph\@tempcnta}} 
    \advance\@tempcnta\@ne 
\repeat 

Questo definirà \bA, \bB, e così via, per espandere a \mathbb{A}, \mathbb{B} e così via.

Problemi correlati