2010-06-01 16 views
5

En lugar de hacer una macro para cada letra, como enforma rápida de hacer 26 macros (una para cada letra)

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

¿Hay una forma de bucle sobre una clase de caracteres (como letras mayúsculas) y generar macros para cada uno? También me gustaría hacer lo mismo con las letras griegas (usando bm en lugar de mathbf).

+0

Por cierto, estoy buscando una respuesta (La) Tex. Actualmente tengo un script bash, pero quiero una solución (La) TeX única. – Geoff

+1

No sé Látex, así que solo agregaré esto como un comentario: ¿hay alguna construcción de scripting dentro de lo que sea que esté usando para generar las macros?y si es así, ¿tiene la capacidad de llamar algo al efecto de 'echo -e -n '\ x41''. Al incrementar el número "41", pasaría por todas las letras ascii del alfabeto (comenzando con la letra "A" mayúscula). – aronchick

+0

@aronchick - Esa es la idea. La respuesta de Andrews a continuación lo hace (pero en TeX nos referimos directamente a los caracteres alfabéticos, evitando ascii). – Geoff

Respuesta

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 

Nueva para el griego

\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

Esto es genial. Entonces, la línea 2 es esencialmente un bucle porque se inserta antes del próximo personaje, ¿verdad? La línea uno podría insertarse en la línea 2, pero está separada solo para facilitar la lectura. Una solución de dos líneas! El único inconveniente es tener que escribir el alfabeto. – Geoff

+0

¿Qué tal una lista de letras griegas? ('{Gamma} {mu}' o '\ Gamma \ mu' u otra lista razonable.) – Geoff

+0

No entiendo cómo quieres escribir letras griegas. Usted escribe '\ bA, \ bB', etc. para' A, B, ... '. ¿Qué hay de griego? '\ bGamma'? '\ bmmu'? No entiendo. –

4

no sería mejor definir un comando

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

y que puede ser utilizado tanto en text modo y el modo math. Uso:

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

Resultado:
F (x) = 'inegral delta (x)' dx
Dónde F es bla bla bla y 'delta' es halb halb halb ...

Los dólares externos están ahí para salir del modo matemático (romano) porque el comando \boldmath no tiene efecto en el modo matemático. Los interiores vuelven a las matemáticas (negrita). apoyos adicionales (${\boldmath) asegura que \boldmath comando funcionará únicamente con #1

Otra ventaja de este código está probando nuevos comandos para la existencia de \bb y \bg. Por lo tanto, no puede bloquear a los makros de LaTeX fácilmente.

Espero que esto sea lo que estás buscando.

+0

si quiere tener una macro especialmente diseñada para letras griegas y otra para letras latinas, puede agregar '\ newcommand \ bl [1] {\ ensuremath {\ mathbf {# 1}}} en el preámbulo y usarlo . - Funcionará solo para letras latinas. – Crowley

+0

+1 Supongo que mi pregunta es más académica que práctica. Tu sugerencia es totalmente válida. Supongo que escribir '\ b X' en lugar de' \ bX' no es una distinción muy grande. Aún así, mi objetivo original es evitar el espacio. Su punto con respecto a eliminar macros existentes es especialmente importante. Sería un código muy confuso redefinir '\ bf' por ejemplo. – Geoff

3

yo recomendaría:

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

como dice Crowley, y similares para todos los otros alfabetos. Sin embargo, si realmente quiere hacerlo utilizando el código LaTeX, aquí hay uno que parece funcionar:

\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} 

he perdido la cuenta de las 'expandafter de que hay en eso! Para obtener letras minúsculas, reemplace el Alph por alph.

+0

¿También afectaría las letras griegas? ¿Y por qué usar '\ bH ello \ bW orld', cuando puedes usar' \ b Hello \ b World'? – Crowley

+0

+1 Solución genial. Nunca supe sobre '\ expandafter' o' csname'. Creo que usar esto último te permitirá recortar bastante tu macro. – Geoff

+0

@Crowley: Eché de menos las letras griegas. Uno podría definir una versión de \ alph y \ Alph para letras griegas. Overkill para una aplicación, pero podría ser útil en otros lugares. Con respecto a su segundo punto: ¡Estoy totalmente de acuerdo y así lo dije! En mis documentos, uso (una variante de) su solución. No obstante, la cuestión de poder recorrer el alfabeto era lo suficientemente intrigante que pensé que tendría una oportunidad. Traté de dar un tono que mostrara que no lo haría en la práctica. ¡Después de todo, 18 expansores de expansión podrían considerarse solo una pestaña excesiva! –

6

Ampliando la respuesta de Andrew, aquí es una solución sin \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 

Esto definirá \bA, \bB, y así sucesivamente, a expande a \mathbb{A}, \mathbb{B}, y así sucesivamente.

Cuestiones relacionadas