Contadores y longitudes

LaTeX tiene dos clases de registros: lugares donde recordar un valor. Un contador guarda un entero; una longitud guarda una dimensión. Los números de capítulos, figuras y ecuaciones se cuentan con contadores; los márgenes y anchos de cajas se miden con longitudes. Esta página cubre los fundamentos de programación para definir y manipular tus propios contadores y longitudes. Las unidades en sí y los comandos de espacio como \hspace/\vspace quedan en una página aparte (enlazada abajo); aquí nos centramos en la maquinaria de contar, medir y recordar.

Contadores — registros enteros

Un contador es un contenedor que recuerda un entero. A medida que LaTeX lee el documento, avanza chapter cuando empieza un capítulo, figure cuando colocas una figura, e imprime esos números en el encabezado o la leyenda. Estos son contadores estándar predefinidos, y también puedes crear los tuyos.

Creas un contador nuevo con \newcounter{foo}. Su valor justo después de crearlo es 0. El nombre solo usa letras (sin barra invertida) y no debe existir ya. El detalle clave es el padre opcional: \newcounter{foo}[⟨parent⟩] hace que foo quede subordinado a parent, de modo que cada vez que parent avanza, foo se reinicia automáticamente a 0. Por eso el número de subsección vuelve a empezar cuando cambia la sección.

Tres comandos cambian el valor. \setcounter{foo}{3} asigna a foo el valor 3; \addtocounter{foo}{2} suma 2 al valor actual (pasa un número negativo para restar); y \stepcounter{foo} suma solo 1. \stepcounter tiene un efecto secundario importante: reinicia a 0 todo contador registrado como hijo de ese contador. Observa que las asignaciones hechas por \setcounter y \addtocounter son globales; no se revierten al salir de un grupo ({ } o un entorno).

Su pariente cercano \refstepcounter{foo} hace el mismo avance y reinicio de hijos, pero además convierte foo en el destino de referencia actual. Así, un \label{…} colocado justo después apuntará al valor impreso de foo (su \thefoo, abajo), y \ref recuperará ese número. Este es precisamente el comando que LaTeX usa internamente al avanzar section, equation o figure; por eso un \label en un encabezado o una ecuación referencia el número correcto. Usa \stepcounter para avanzar solo un número interno, y \refstepcounter para crear una “cosa numerada” que se pueda referenciar.

latex
\newcounter{trial}            % trial を作成(初期値 0)
\setcounter{trial}{5}         % trial = 5
\addtocounter{trial}{-2}      % trial = 3
\stepcounter{trial}           % trial = 4(子カウンタがあれば 0 に)

Extraer el número — \value

\value{foo} extrae el contenido de un contador como un número con el que TeX puede calcular. Puedes usarlo donde LaTeX espera un entero: en el argumento de valor de \setcounter/\addtocounter, en una prueba \ifnum, incluso en un cálculo de dimensión (como \value{foo}\parindent). Por ejemplo, para poner bar en línea con foo:

latex
\setcounter{bar}{\value{foo}}        % bar に foo の現在値を代入
\addtocounter{bar}{\value{foo}}      % bar に foo の値をさらに加える

Este es un tropiezo común al empezar: \value no es para mostrar. Para *imprimir* realmente un número en el texto, usa un comando de visualización como \arabic (siguiente sección) o \thefoo. La distinción es esta: \value da el número bruto para aritmética, mientras que los comandos de visualización dan una cadena para que la lean las personas.

Imprimir un contador — \the y comandos de formato

Cada contador trae una familia de comandos de visualización que convierten su valor en una cadena impresa. Tú eliges la notación:

ComandoSalidaRango / notas
\arabicNúmeros arábigos (1, 2, 3 …)La opción habitual; permite valores negativos
\romanNúmeros romanos en minúscula (i, ii, iii …)Por debajo de 1 no imprime nada
\RomanNúmeros romanos en mayúscula (I, II, III …)Por debajo de 1 no imprime nada
\alphLetras minúsculas (a, b, c …)1–26; fuera de rango da error
\AlphLetras mayúsculas (A, B, C …)1–26; fuera de rango da error
\fnsymbolSímbolos de nota al pie (∗ † ‡ § ¶ ‖ …)1–9; para modo matemático

\alph/\Alph se asignan a las 26 letras, así que un valor menor que 1 o mayor que 26 produce el error “Counter too large”. \fnsymbol emite nueve símbolos de nota al pie en orden: asterisco, daga, doble daga, signo de sección, signo de párrafo, barras paralelas, doble asterisco, doble daga y doble doble daga; el rango válido es 1–9. Como funciona en modo matemático, envuélvelo como $\fnsymbol{footnote}$ en texto, o úsalo mediante \thefootnote.

Estos comandos toman el nombre de un contador como argumento (por ejemplo \arabic{page}). Pero el número que ves realmente impreso lo emite una macro dedicada que cada contador recibe automáticamente: \thefoo. section tiene \thesection, figure tiene \thefigure, y así sucesivamente. Redefinir este \the… con \renewcommand cambia todo el formato del número. Para poner los números de sección en romanos, por ejemplo, basta una línea:

latex
\renewcommand{\thesection}{\Roman{section}}   % 1, 2, 3 → I, II, III
% 図番号を「節.通し番号」に:図 2.3 のように
\renewcommand{\thefigure}{\thesection.\arabic{figure}}

Como en el segundo ejemplo, incorporar la visualización de otro contador en una definición \the… produce números compuestos como “2.3”. Esto funciona porque el contador de figuras está configurado con el contador de secciones como padre (su disparador de reinicio). Así se ve que la apariencia de un número y el vínculo que decide cuándo vuelve a 0 se determinan por separado.

Contadores estándar y profundidad de numeración

LaTeX predefine y mueve automáticamente un conjunto de contadores en el documento. También puedes manipularlos libremente con \setcounter y comandos similares: renumerar capítulos a mitad del documento, hacer que las figuras de un apéndice aparezcan como A.1, etc.:

  • Seccionado: part, chapter, section, subsection, subsubsection, paragraph, subparagraph (la disponibilidad depende de la clase)
  • Flotantes y ecuaciones: figure, table, equation
  • Notas al pie: footnote, mpfootnote (notas dentro de una minipage)
  • Listas: enumi, enumii, enumiii, enumiv (los cuatro niveles de anidamiento de enumerate)
  • Página: page
  • Control: secnumdepth (hasta qué profundidad se numeran los títulos) y tocdepth (hasta qué profundidad llegan las entradas al índice)

Los dos últimos son de otra clase: interruptores enteros que gobiernan hasta qué “profundidad” llegan la numeración y las listas. Cada comando de seccionado tiene un número de nivel (section es 1, subsection es 2, …), y un nivel se numera cuando es menor o igual que secnumdepth. El valor predeterminado ronda 2, así que \setcounter{secnumdepth}{1} quita números por debajo del nivel de sección, y \setcounter{tocdepth}{1} limita el índice a secciones. Es un buen ejemplo de que los contadores no solo sirven para contar, sino también como valores de configuración que dirigen la composición.

Longitudes — registros de dimensión

La otra clase, una longitud, es un registro que recuerda una dimensión como 12pt o 2cm. Mientras que un contador es un entero, una longitud guarda una dimensión con unidad y puede llevar estiramiento y contracción (plus/minus). Si reutilizas la misma dimensión por todo el documento, ponerle nombre a una longitud es mucho más mantenible que escribir el número fijo.

Declaras una longitud nueva con \newlength{\mylen}. A diferencia de un contador, el argumento es un nombre de comando con barra invertida (\mylen), y el valor inicial es 0pt. Dos comandos hacen el trabajo básico: \setlength{\mylen}{2em} (asignar) y \addtolength{\mylen}{-3pt} (sumar; un valor negativo resta). Una vez creada, la longitud puede aparecer en cualquier lugar donde se espere una dimensión, como en \hspace{\mylen}.

También puedes calcular con longitudes existentes como \textwidth (el ancho del cuerpo) y \baselineskip (la interlínea). Anteponiendo un factor las escalas: 0.8\textwidth es el 80 % del ancho del cuerpo; también puedes sumar o restar longitudes directamente. Para aritmética más rica, y en particular división, carga el paquete calc. Entonces una expresión como \setlength{\x}{\textwidth/3} (un tercio del ancho del cuerpo), que divide una dimensión por un entero, funciona tal cual.

Una salvedad con calc: para escalar una dimensión por un factor real, se escribe de otra forma que la división entera, insertando \real{} (por ejemplo \widthof{palabra} * \real{0.68}). Además, las expresiones deben ser coherentes en tipo: 2cm + 4 (un entero desnudo sumado a una dimensión) es ilegal, mientras que 2cm + 4pt, con dimensiones en ambos lados, está bien.

document.tex
\usepackage{calc}
\newlength{\thirdcol}
\setlength{\thirdcol}{\textwidth/3}     % 本文幅の 1/3
\addtolength{\thirdcol}{-1em}            % そこから 1em 引く

Medir material compuesto — \settowidth y compañía

Las operaciones de longitud más potentes miden el resultado de una composición real y lo guardan en una longitud. \settowidth{\mylen}{texto} compone internamente el texto dado y pone su anchura en \mylen. Del mismo modo, \settoheight mide la altura sobre la línea base y \settodepth la profundidad por debajo de ella (cada una apunta a una longitud declarada antes con \newlength).

Esto brilla cuando quieres una dimensión que se ajuste a su contenido: “una regla exactamente tan ancha como esta palabra de encabezado”, o “un ancho de etiqueta ajustado a la entrada más larga”. El ejemplo siguiente mide el ancho de una palabra y coloca debajo una regla de la misma longitud:

document.tex
\newlength{\wd}
\settowidth{\wd}{重要}        % 「重要」の組版幅を測る
\noindent 重要\par
\rule{\wd}{0.4pt}            % 同じ幅の罫線

La misma idea de “componer y medir” continúa en \widthof{texto}/\heightof/\depthof del paquete calc, mencionado antes. La diferencia: \settowidth es un comando que asigna el resultado a una longitud, mientras que \widthof puede colocarse directamente en una expresión como valor.

Uniendo piezas — un contador propio y una longitud medida

Por último, un ejemplo pequeño que usa ambos. Creamos un contador propio question, formateamos su visualización como “Q1.”, “Q2.”, …, y definimos un comando simple \question que avanza e imprime el número cada vez que se llama. Como usa \refstepcounter, puedes poner \label a cada pregunta y referenciarla después con \ref:

document.tex
\newcounter{question}
\renewcommand{\thequestion}{Q\arabic{question}}
\newcommand{\question}{\refstepcounter{question}\par\noindent\textbf{\thequestion.}\ }
\begin{document}
\question 最初の問い。\label{q:first}
\question 次の問い。
問い~\ref{q:first} を参照。   % → 問い Q1 を参照
\end{document}

Al definir \thequestion con \renewcommand, el formato del número (Q + numeral arábigo) queda concentrado en un solo lugar y es fácil cambiarlo después. El mismo instinto sirve para las longitudes: construye dimensiones relativas al ancho del cuerpo (\textwidth), o fíjalas midiendo contenido con \settowidth, y el documento conservará sus proporciones cuando cambien el tamaño del papel o los márgenes. En vez de escribir valores fijos por todas partes, ponles nombre y gestiónalos en un solo lugar: esa es la clave para usar contadores y longitudes como herramientas de programación.