1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
|
%&pdflatex
% $Id: macros2e.tex 2521 2011-07-23 19:14:33Z martin $
\documentclass[12pt,a4paper]{article}
\usepackage[margin=1in]{geometry}
\usepackage{ydoc-desc}[2010/02/16]
\usepackage{newverbs}
\MakeShortVerb\|
\def\q#1{`#1'}
\def\qq#1{``#1''}
\MakeSpecialShortVerb\qverb\"
\AtBeginDocument{\MakeShortMacroArgs*\`}
\AtEndDocument{\DeleteShortMacroArgs\`}
\newcommand\Q[1]{``\texttt{#1}''}
\usepackage{hyperref}
\usepackage{xcolor}
\hypersetup{filecolor=macrodesc}
\usepackage{booktabs}
\usepackage{tabularx}
\usepackage{multicol}
\usepackage{zref-user}
\usepackage{zref-abspos}
\usepackage{zref-xr}
\usepackage{graphicx}
% Relative position of `source2e` without extension
\def\sourceIIe{/usr/local/texlive/2010/texmf-dist/doc/latex/base/source2e}
%source2e}
\makeatletter
% Bug-fix for missing declaration:
\@ifundefined{ZREF@xr@ignored}{\newcount\ZREF@xr@ignored}{}
% Redefine the format of macro names to link to 'source2e':
\def\PrintMacroName#1{%
{\macrodescstyle{\strut
\begingroup
\escapechar\m@ne
\edef\name{\string #1}%
\edef\@tempa{\noexpand\exthref{\name}{\noexpand\texttt{\char92}\name}}%
\expandafter\endgroup\@tempa
}}%
}
\iffalse
\def\exthref#1#2{{%
% Get page of 'desc-'iption label
\edef\page{\zref@extract{desc-#1}{abspage}}%
\ifnum0\page=0\relax
% If it doesn't exist try the 'code-' label
\edef\page{\zref@extract{code-#1}{abspage}}%
\ifnum0\page=0\else
%\Gin@defaultbp\x{\zposx{code-#1}sp}%
\Gin@defaultbp\y{\zposy{code-#1}sp}%
\zrefused{code-#1}%
%\message{^^J USED LABEL^^Jcode-#1^^J}%
\fi
\else
%\Gin@defaultbp\x{\zposx{desc-#1}sp}%
\Gin@defaultbp\y{\zposy{desc-#1}sp}%
\zrefused{desc-#1}%
%\message{^^J USED LABEL^^Jdesc-#1^^J}%
\fi
\ifnum0\page=0\relax
% Simply typeset the text if no label is found
#2%
%\message{^^J No reference for: '\string#2'^^J}%
\else
% Otherwise set link to Fit Horizontally at the given y-coordinate
\href[{page=\page,pdfnewwindow=true,pdfremotestartview=FitH \y}]{file:\sourceIIe.pdf}%
%{\llap{\tiny\page,\y\ }
{#2}%
\fi
}}
\def\siieposs#1#2#3#4\relax{%
\Gin@defaultbp\x{#1sp}%
\Gin@defaultbp\y{#2sp}%
\def\p{#3}%
}
\def\siiepos#1#2{%
\siieposs#2\relax
\message{^^J\noexpand\siiepos{#1}{\x}{\y}{\p}}
}
\else
\def\siiepos#1#2#3#4{%
\@namedef{siiepos@#1@x}{#2}%
\@namedef{siiepos@#1@y}{#3}%
\@namedef{siiepos@#1@p}{#4}%
}
\def\exthref#1#2{%
\@ifundefined{siiepos@#1@p}{%
% Simply typeset the text if no label is found
#2%
%\message{^^J No reference for: '\string#2'^^J}%
}{%
% Otherwise set link to Fit Horizontally at the given y-coordinate
\href[page=\@nameuse{siiepos@#1@p},pdfnewwindow=true,pdfremotestartview=FitH \@nameuse{siiepos@#1@y}]{file:\sourceIIe.pdf}%
{#2}%
}%
}
\fi
\siiepos{@addtofilelist}{64.4291}{530.5617}{75}
\siiepos{addto@hook}{83.25822}{503.54074}{131}
\siiepos{@Alph}{106.79463}{245.35754}{113}
\siiepos{@alph}{106.79463}{321.19466}{113}
\siiepos{arraystretch}{73.84366}{568.89484}{266}
\siiepos{@arstrutbox}{78.55093}{532.63092}{266}
\siiepos{@backslashchar}{64.4291}{288.49547}{37}
\siiepos{@begin@tempboxa}{59.72182}{151.91508}{241}
\siiepos{bgroup}{102.08734}{228.77116}{25}
\siiepos{@break@tfor}{78.55093}{254.67577}{45}
\siiepos{@bsphack}{92.67278}{338.35991}{60}
\siiepos{@cclvi}{102.08734}{659.32011}{20}
\siiepos{@cclv}{106.79463}{689.89565}{20}
\siiepos{@charlb}{97.38007}{444.76064}{73}
\siiepos{@charrb}{97.38007}{432.8055}{73}
\siiepos{@classoptionslist}{50.30725}{732.87947}{375}
\siiepos{@clsextension}{69.13638}{519.08176}{375}
\siiepos{count@}{102.08734}{529.44287}{21}
\siiepos{@ctrerr}{97.38007}{223.98906}{51}
\siiepos{@currenvir}{83.25822}{675.0963}{211}
\siiepos{@currext}{92.67278}{555.34567}{375}
\siiepos{@currname}{87.9655}{591.60959}{375}
\siiepos{dimen@ii}{92.67278}{493.57745}{21}
\siiepos{dimen@i}{97.38007}{505.5326}{21}
\siiepos{dimen@}{102.08734}{517.48773}{21}
\siiepos{egroup}{102.08734}{216.81602}{25}
\siiepos{@empty}{102.08734}{582.16159}{45}
\siiepos{empty}{106.79463}{301.299}{25}
\siiepos{end}{116.20918}{358.88287}{213}
\siiepos{@end@tempboxa}{69.13638}{706.24886}{242}
\siiepos{@Esphack}{92.67278}{192.76773}{61}
\siiepos{@esphack}{92.67278}{304.81541}{61}
\siiepos{@expandtwoargs}{64.4291}{335.09938}{37}
\siiepos{@filelist}{87.9655}{576.76791}{75}
\siiepos{@firstofone}{78.55093}{463.95224}{37}
\siiepos{@firstoftwo}{78.55093}{451.9971}{37}
\siiepos{@flushglue}{83.25822}{140.80533}{42}
\siiepos{@for}{111.5019}{513.18219}{45}
\siiepos{g@addto@macro}{69.13638}{394.49792}{383}
\siiepos{GenericError}{73.84366}{286.28459}{46}
\siiepos{GenericInfo}{78.55093}{522.39859}{46}
\siiepos{@gobblefour}{78.55093}{497.60475}{37}
\siiepos{@gobble}{97.38007}{521.51503}{37}
\siiepos{@gobbletwo}{83.25822}{509.55989}{37}
\siiepos{hexnumber@}{83.25822}{571.48509}{178}
\siiepos{hideskip}{92.67278}{453.08853}{22}
\siiepos{@iden}{106.79463}{406.38943}{37}
\siiepos{@ifclasslater}{69.13638}{616.91463}{376}
\siiepos{@ifclassloaded}{64.4291}{767.74863}{376}
\siiepos{@iffileonpath}{69.13638}{150.01534}{73}
\siiepos{if@filesw}{87.9655}{779.70377}{70}
\siiepos{ifin@}{106.79463}{593.51366}{157}
\siiepos{ifnot@nil}{87.9655}{553.58012}{143}
\siiepos{@ifpackagelater}{59.72182}{628.86977}{376}
\siiepos{@ifpackageloaded}{55.01453}{779.70377}{376}
\siiepos{if@partsw}{87.9655}{767.74863}{70}
\siiepos{if@tempswa}{83.25822}{348.22577}{42}
\siiepos{in@}{116.20918}{605.4688}{157}
\siiepos{iterate}{97.38007}{767.74863}{26}
\siiepos{@ixpt}{106.79463}{328.01884}{131}
\siiepos{l@ngrel@x}{87.9655}{145.68292}{32}
\siiepos{loop}{111.5019}{779.70377}{26}
\siiepos{@makeother}{83.25822}{570.09033}{216}
\siiepos{maxdimen}{92.67278}{465.04367}{22}
\siiepos{MessageBreak}{73.84366}{590.14438}{46}
\siiepos{@Miii}{106.79463}{445.91852}{42}
\siiepos{@Mii}{111.5019}{457.87366}{42}
\siiepos{@Mi}{116.20918}{469.8288}{42}
\siiepos{@Miv}{111.5019}{433.96338}{42}
\siiepos{@MM}{116.20918}{623.4547}{20}
\siiepos{m@ne}{111.5019}{601.9707}{21}
\siiepos{@M}{120.91647}{635.40984}{20}
\siiepos{@m}{120.91647}{647.36497}{20}
\siiepos{@ne}{116.20918}{737.7162}{20}
\siiepos{@nnil}{106.79463}{616.65128}{45}
\siiepos{null}{111.5019}{265.03508}{25}
\siiepos{@obsoletefile}{69.13638}{682.53369}{75}
\siiepos{@onelevel@sanitize}{45.59998}{542.79277}{41}
\siiepos{@onlypreamble}{69.13638}{338.95767}{32}
\siiepos{@pkgextension}{69.13638}{507.12662}{375}
\siiepos{p@}{120.91647}{418.60434}{22}
\siiepos{@protected@testopt}{45.59998}{136.21292}{33}
\siiepos{@ptionlist}{83.25822}{176.96553}{375}
\siiepos{remove@star}{78.55093}{438.01378}{143}
\siiepos{remove@to@nnil}{64.4291}{461.92406}{143}
\siiepos{rem@pt}{102.08734}{402.0999}{122}
\siiepos{repeat}{102.08734}{755.79349}{26}
\siiepos{@sanitize}{87.9655}{626.47874}{41}
\siiepos{@secondoftwo}{73.84366}{440.04196}{37}
\siiepos{@settopoint}{78.55093}{386.73682}{114}
\siiepos{sixt@@n}{97.38007}{701.85078}{20}
\siiepos{skip@}{106.79463}{481.62231}{21}
\siiepos{space}{106.79463}{337.56291}{25}
\siiepos{@spaces}{97.38007}{233.35391}{50}
\siiepos{@sptoken}{92.67278}{213.96835}{40}
\siiepos{@star@or@long}{69.13638}{225.38385}{32}
\siiepos{@starttoc}{87.9655}{283.38025}{296}
\siiepos{strip@prefix}{73.84366}{356.49013}{11}
\siiepos{strip@pt}{92.67278}{414.05504}{122}
\siiepos{strutbox}{92.67278}{734.27771}{27}
\siiepos{@tempboxa}{87.9655}{256.4905}{42}
\siiepos{@tempcnta}{87.9655}{394.0934}{42}
\siiepos{@tempcntb}{87.9655}{382.13826}{42}
\siiepos{@tempdima}{87.9655}{313.31702}{42}
\siiepos{@tempdimb}{87.9655}{301.36188}{42}
\siiepos{@tempdimc}{87.9655}{289.40674}{42}
\siiepos{@tempskipa}{83.25822}{221.58173}{42}
\siiepos{@tempskipb}{83.25822}{209.62659}{42}
\siiepos{@temptokena}{78.55093}{175.71408}{42}
\siiepos{@testopt}{92.67278}{252.89267}{33}
\siiepos{@tfor}{106.79463}{343.95984}{45}
\siiepos{@thirdofthree}{69.13638}{370.74442}{37}
\siiepos{thr@@}{106.79463}{713.80592}{20}
\siiepos{toks@}{106.79463}{469.66718}{21}
\siiepos{tw@}{116.20918}{725.76106}{20}
\siiepos{@unusedoptionlist}{50.30725}{685.65668}{375}
\siiepos{@vbsphack}{87.9655}{736.86452}{62}
\siiepos{@viiipt}{97.38007}{363.12321}{131}
\siiepos{@viipt}{102.08734}{398.22762}{131}
\siiepos{@vipt}{106.79463}{433.33199}{131}
\siiepos{voidb@x}{97.38007}{382.73892}{22}
\siiepos{@vpt}{111.5019}{468.43637}{131}
\siiepos{@whiledim}{87.9655}{510.31464}{44}
\siiepos{@whilenum}{87.9655}{567.50005}{44}
\siiepos{@whilesw}{92.67278}{440.17783}{44}
\siiepos{wlog}{111.5019}{565.70679}{21}
\siiepos{@writefile}{83.25822}{449.68938}{212}
\siiepos{@xiipt}{102.08734}{222.7057}{131}
\siiepos{@xipt}{106.79463}{257.81009}{131}
\siiepos{@xivpt}{102.08734}{187.60133}{131}
\siiepos{@xpt}{111.5019}{292.91446}{131}
\siiepos{@xviipt}{97.38007}{152.49695}{131}
\siiepos{@xxpt}{106.79463}{117.39256}{131}
\siiepos{@xxvpt}{102.08734}{779.70377}{132}
\siiepos{@xxxii}{102.08734}{504.73756}{42}
\siiepos{zap@space}{87.9655}{639.23088}{381}
\siiepos{z@}{120.91647}{406.6492}{22}
\siiepos{z@skip}{102.08734}{394.69406}{22}
\siiepos{@dblarg}{144.7269}{382.64244}{31}
\siiepos{filename@parse}{144.7269}{274.5259}{12}
\siiepos{@ifdefinable}{144.7269}{311.46509}{31}
\siiepos{@ifnextchar}{144.7269}{466.32841}{31}
\siiepos{@ifstar}{144.7269}{420.99852}{31}
\siiepos{@ifundefined}{144.7269}{347.3305}{31}
\siiepos{input@path}{144.7269}{466.08487}{12}
\siiepos{input}{144.7269}{400.3316}{374}
\siiepos{@namedef}{144.7269}{514.70245}{31}
\siiepos{@nameuse}{144.7269}{490.2387}{31}
\siiepos{@@par}{144.7269}{387.73839}{54}
\siiepos{@restorepar}{144.7269}{411.37193}{54}
\siiepos{@setpar}{144.7269}{465.26593}{54}
% Load the external references
%\zexternaldocument{\sourceIIe}
\title{List of internal \LaTeX2e Macros useful to Package Authors}
\author{Compiled by Martin Scharrer\\\url{martin@scharrer-online.de}}
\date{Version 0.4a -- 2017/12/09}
\setlength{\descindent}{0pt}
\setlength{\parindent}{0pt}
\makeatletter
\begin{document}
\maketitle
\begin{abstract}
This document lists the internal macros defined by the \LaTeX2e base files which can be also useful
to package authors. The macros are hyper-linked to their description in \emph{source2e}.
For this to work both PDFs must be inside the same directory.
This document is not yet complete in content and format and may miss some macros.
\end{abstract}
\begin{multicols}{2}
\tableofcontents
\end{multicols}
\clearpage
\section{Constants}
\subsection{Number Constants}
Some of the following integer values are defined using `\countdef` (for $-1$),
`\chardef` (for values between 0--255) and `\mathchardef` ($>255$). They are
robust and do not expand in an `\edef` context. When used on the right side of an
assignment the act the same way as a count register. The `\m@ne` is a real count register and can
still be modified, but doing so would certainly break various code. In the terms defined by
\emph{The TeXbook}, this integer constants yield \emph{internal integers} rather than \emph{integer
denotations}.
The other numbers are defined as normal macros, which will simply expand to the containing number.
They were defined
to be used to set font sizes, which explains the non-integer numbers. Please note that if they
are used for an assignment or other numeric context (e.g.\ |\ifnum|) TeX will keep expanding the
following tokens until a non-numeric token is found.%, e.g.\ a space or |\relax|.
\bigskip
\noindent\hbox to \linewidth\bgroup\hss
\begin{tabular}{lrl}
\toprule
Macro & Value & Defined using \\
\midrule
\Macro\@ne & 1 & chardef \\
\Macro\tw@ & 2 & chardef \\
\Macro\thr@@ & 3 & chardef \\
\Macro\sixt@@n & 16 & chardef \\
\Macro\@xxxii & 32 & chardef \\
\Macro\@cclv & 255 & chardef \\
\Macro\@cclvi & 256 & mathchardef \\
\Macro\@m & 1000 & mathchardef \\
\Macro\@M & 10000 & mathchardef \\
\Macro\@Mi & 10001 & mathchardef \\
\Macro\@Mii & 10002 & mathchardef \\
\Macro\@Miii & 10003 & mathchardef \\
\Macro\@Miv & 10004 & mathchardef \\
\Macro\@MM & 20000 & mathchardef \\
\bottomrule
\end{tabular}
\hss
\begin{tabular}{lrl}
\toprule
Macro & Value & Defined using \\
\midrule
\Macro\@vpt & 5 & def \\
\Macro\@vipt & 6 & def \\
\Macro\@viipt & 7 & def \\
\Macro\@viiipt & 8 & def \\
\Macro\@ixpt & 9 & def \\
\Macro\@xpt & 10 & def \\
\Macro\@xipt & 10.95 & def \\
\Macro\@xiipt & 12 & def \\
\Macro\@xivpt & 14.4 & def \\
\Macro\@xviipt & 17.28 & def \\
\Macro\@xxpt & 20.74 & def \\
\Macro\@xxvpt & 24.88 & def \\
\\%\midrule
\Macro\m@ne & $-1$ & countdef \\
\bottomrule
\end{tabular}%
\hss\egroup
\subsection{Dimension Constants}
The following dimension and skip constants are defined using registers. They must not be changed.
\begin{center}
\begin{tabularx}{\linewidth}{lrlX}
\toprule
Macro & Value & Defined using & Notes \\
\midrule
\Macro\p@ & 1pt & newdimen & Can be used as a replacement of pt behind a number due to the resulting multiplication \\
\Macro\z@ & 0pt & newdimen & Can be used both for 0pt and 0 \\
\Macro\maxdimen & 16383.99999pt & newdimen & Largest valid dimension \\
\bottomrule
\end{tabularx}
\par\medskip
\begin{tabularx}{\linewidth}{lrlX}
\toprule
Macro & Value & Defined using & Notes\\
\midrule
\Macro\z@skip & 0pt plust0pt minus0pt & newskip & \\
\Macro\hideskip & $-1000$pt plus 1fill & newskip & negative but can grow \\
\Macro\@flushglue & 0pt plus 1fil & newskip & \\
\bottomrule
\end{tabularx}
\end{center}
\subsection{String Constants}
The following macros hold common strings and are fully expandable.
Some special characters are defined here as their verbatim ASCII representation.
This makes them useful if such characters are to be written into an auxiliary file.
\bigskip\noindent
\begin{tabularx}{\linewidth}{llX}
\toprule
Macro & Value & Note\\
\midrule
\Macro\space & One space & An explicit space (catcode 10 \qq{space}).\\
\Macro\@spaces & Four spaces & Contains $4\times$\Macro\space.\\
\Macro\empty & Empty string & Commonly used to define empty macros using \Macro\let. \\
\Macro\@empty & Empty string & Same as above. Used by the \LaTeX{} kernel commands. \\
\Macro\@backslashchar & \qq{\texttt{\@backslashchar}} & Backslash with catcode 12 (other), i.e. simple ASCII backlash usable in e.g.\ \Macro\write.\\
\Macro\@percentchar & \qq{\texttt{\@percentchar}} & Percent character with catcode 12 (other), i.e. simple ASCII percent usable in e.g.\ \Macro\write.\\
\Macro\@charlb & \qq{\texttt{\@charlb}} & Left brace with catcode 11 (letter). \\
\Macro\@charrb & \qq{\texttt{\@charrb}} & Right brace with catcode 11 (letter). \\
\Macro\@clsextension & \qq{\texttt{cls}} & Used for comparison with \Macro\@currext. \\
\Macro\@pkgextension & \qq{\texttt{sty}} & Used for comparison with \Macro\@currext. \\
\Macro\@depth & \qq{\texttt{depth}} & Used for box size declarations (\Macro\hb@xt@).\\
\Macro\@height & \qq{\texttt{height}} & Used for box size declarations.\\
\Macro\@width & \qq{\texttt{width}} & Used for box size declarations.\\
\Macro\@minus & \qq{\texttt{minus}} & Used for skip declarations.\\
\Macro\@plus & \qq{\texttt{plus}} & Used for skip declarations.\\
\bottomrule
\end{tabularx}
\subsection{Token Constants}
The following macros are defined using \Macro\let<macro>'='<token> and therefore equal to this token. They are useful for |\ifx| comparisons
with tokens read by |\let| or |\futurelet|.
\bigskip\noindent
\begin{tabular}{llll}
\toprule
Name & Token & Catcode & Note \\
\midrule
\Macro\@sptoken & Space & 10 & Should not be confused with \Macro\space \\
\Macro\bgroup & |{| & 1 & Begin of group \\
\Macro\egroup & |}| & 2 & End of group \\
\bottomrule
\end{tabular}
\subsection{Other}
\begin{tabularx}{\linewidth}{lllX}
\toprule
Macro & Value & Defined using & Notes \\
\midrule
\Macro\voidb@x & (void) & newbox & permanently void box register \\
\Macro\@undefined & (undef) & (undefined) & This macro is not defined.
It is used to test if other macros are undefined (using \Macro\ifx) or set them to an undefined state (using \Macro\let).\\
\bottomrule
\end{tabularx}
\clearpage
\section{Variables}
\subsection{Temporary Variables}
The following variables are defined and used by the \LaTeX{} kernel commands as scratch registers and macros.
They can be used with care, but should only be redefined inside a local group to avoid interference with other
code. Care must also be taken if they are used together with external macros, which might use them as well
-- maybe not yet but in the next release.
\par\bigskip\noindent
\begin{tabularx}{\linewidth}{llX}
\toprule
Temp variable & Type & Note \\
\midrule
\Macro\count@ & counter & \\
\Macro\@tempcnta & counter & \\
\Macro\@tempcntb & counter & \\
\Macro\dimen@ & dimension & \\
\Macro\dimen@i & dimension & Marked as \qq{global only} \\
\Macro\dimen@ii & dimension & \\
\Macro\@tempdima & dimension \\
\Macro\@tempdimb & dimension \\
\Macro\@tempdimc & dimension \\
\Macro\@tempa & macro \\
\Macro\@tempb & macro \\
\Macro\@tempc & macro \\
\Macro\@gtempa & macro & For temporary definitions which must be made global\\
\Macro\skip@ & skip & \\
\Macro\@tempskipa & skip \\
\Macro\@tempskipb & skip \\
\Macro\toks@ & token register & \\
\Macro\@temptokena & token register \\
\Macro\if@tempswa & if switch & Comes with the usual setters \Macro\@tempswatrue and \Macro\@tempswafalse \\
\Macro\@tempboxa & box register \\
\Macro\@let@token & \q{let} & Used by \Macro\@ifnextchar to temporary store the next token using \Macro\futurelet. Can be used for similar purposes. \\
\bottomrule
\end{tabularx}
\subsection{Dimension Variables}
\par\bigskip\noindent
\begin{tabularx}{\linewidth}{lX}
\toprule
Macro & Description \\
\midrule
\Macro\@wholewidth &
This |dimen| register hold the full line width (thickness) in \env{picture} environments. \\
\Macro\@halfwidth &
This |dimen| register holds the half line width (thickness) in \env{picture} environments. \\
\bottomrule
\end{tabularx}
\subsection{String and Other Variables}
\par\bigskip\noindent
\begin{tabularx}{\linewidth}{lX}
\toprule
Macro & Description \\
\midrule
\Macro\@currext & Extension of the current package or class file, empty outside. \\
\Macro\@currname & File name base of the current package or class file, empty outside. \\
\Macro\@currenvir & Name of the current environment. \\
\Macro\@currenvline & Line number of the begin of the current environment \\
\Macro\@currentlabel & The value a \Macro\label will point to. Set by \Macro\stepcounter and \Macro\refstepcounter. \\
\bottomrule
\end{tabularx}
\section{Macros}
\subsection{Macro Definition}
\DescribeMacro\@namedef{<name>}<parameter list>{<definition>}
\noindent
Defines macro \MacroArgs'\'<name>\relax using \Macro\def. Can be prefixed with \Macro\long and \Macro\global.
\DescribeMacro\@nameuse{<name>}
\noindent
Expands to macro \MacroArgs'\'<name>.
\DescribeMacro\@ifnextchar<token>{<yes>}{<no>}
\noindent
Tests if next non-space token is equal to \MacroArgs<token>.
\DescribeMacro\@ifstar{<yes>}{<no>}
\noindent
Tests of next non-space token is "*". Removes star for \MacroArgs<yes> branch.
\DescribeMacro\@dblarg{<cmd>}{<arg>}
\noindent
Expands to \MacroArgs<cmd>[<arg>]{<arg>}.
\DescribeMacro\@ifundefined{<name>}{<yes>}{<no>}
\noindent
Tests if \MacroArgs!\@backslashchar!<name> is defined (and not equal to \Macro\relax).
\DescribeMacro\@ifdefinable'\'<name>{<yes>}
\noindent
Tests if \MacroArgs'\'<name> is undefined, \MacroArgs<name> not "relax"
and doesn't start with "end", and if \Macro{end}<name> is not defined.
\DescribeMacro\@onlypreamble<macro>
\noindent
The given \meta{macro} is marked as only be valid in the preamble. It will be redefined as an error message AtBeginDocument.
\DescribeMacro\@star@or@long
\noindent
Tests for a following "*", if found \Macro\l@ngrel@x will be let to \Macro\relax, but \Macro\long
otherwise. It can the be used before \Macro\def as an potential prefix.
\DescribeMacro\@testopt{<1>}{<2>}
\noindent
Short for \Macro\@ifnextchar'['{<1>}{<1>[{<2>}]}, i.e.\ \meta{2} will be used as default argument if non was given.
\DescribeMacro\@protected@testopt
\noindent
Robust version of \Macro\@testopt?
\DescribeMacro\addto@hook<token register>{<code>}
\noindent
Appends code to the token register.
\DescribeMacro\g@addto@macro<macro>{<code>}
\noindent
Appends \meta{code} to the definition of \MacroArgs<macro>.\\
\subsection{Expanding/Gobbling Arguments}
\par\bigskip\noindent
\begin{tabularx}{\linewidth}{lX}
\toprule
Macro & Description \\
\midrule
\Macro\@gobble{<arg>} & Removes (gobbles) its argument. (long)\\
\Macro\@gobbletwo{<arg 1>}{<arg 2>} & Removes (gobbles) two arguments. (long)\\
\Macro\@gobblefour{<1>}{<2>}{<3>}{<4>} & Removes (gobbles) four arguments. (long)\\
\Macro\@gobblecr & Gobbles a following carriage return, ignores spaces otherwise \\
\Macro\@firstofone{<arg>} & Expands to \meta{arg}, i.e. is used to remove braces. (long)\\
\Macro\@iden{<arg>} & Identity. Same as \Macro\@firstofone for compatibility reasons. (long)\\
\Macro\@firstoftwo{<1>}{<2>} & Expands to \meta{1}, discards \meta{2}. (long)\\
\Macro\@secondoftwo{<1>}{<2>} & Expands to \meta{2}, discards \meta{1}. (long)\\
\Macro\@thirdofthree{<1>}{<2>}{<3>} & Expands to \meta{3}, discards \meta{1} and \meta{2}. (long)\\
\Macro\@expandtwoargs\AlsoMacro\macro{<1>}{<2>} & Expands the two arguments using \Macro\edef and feeds it to \Macro\macro.\\
\bottomrule
\end{tabularx}
\subsection{Lists}
\DescribeMacro\in@{<1>}{<2>}
Checks if first argument occurs in the second and sets the switch \Macro\ifin@ accordantly.
The arguments are not expanded. This must be done beforehand.
\DescribeMacro\@removeelement{<element>}{<list>}{<cs>}
Removes an element from a comma-separated list and puts it into a control sequence.
\subsection{Loops}
\begin{tabularx}{\linewidth}{lX}
\toprule
Macro & Description \\
\midrule
\Macro\loop' ... '\AlsoMacro\iterate' ... '\AlsoMacro\repeat & \\
\Macro\@whilenum <test> \AlsoMacro\do {<body>} & While loop with \Macro\ifnum test. \\
\Macro\@whiledim <test> \AlsoMacro\do {<body>} & While loop with \Macro\ifdim test. \\
\Macro\@whilesw <switch> \AlsoMacro\fi {<body>} & While loop with \MacroArgs<switch> test. \\
\Macro\@for<macro>':='<list>\AlsoMacro\do{<body>} & For loop. The \MacroArgs<list> is supposed to expand to a comma separated list.
Defines \MacroArgs<macro> to each element of the list and executes \meta{body} each time.
Supports an empty lists without errors. \\
\Macro\@tfor<macro>':='<list>\AlsoMacro\do{<body>} & For loop. The \MacroArgs<list> is not expanded and taken as a list of tokens or \MacroArgs{...}.
Defines \MacroArgs<macro> to each element of the list and executes \meta{body} each time.
Supports an empty lists without errors. \\
\Macro\@break@tfor & Break out of a \Macro\@tfor loop. This should be called \emph{inside} the scope of an \Macro\fi.\\
\bottomrule
\end{tabularx}
\par\bigskip\noindent
NOTES:\par\vspace{-1ex}
\begin{enumerate}\itemsep=0pt
\item These macros use no |\@temp| sequences.
\item These macros do not work if the body contains anything that
looks syntactically to TeX like an improperly balanced |\if \else \fi|.
\end{enumerate}
\subsection{Colors}
The following macros are defined equal to |\relax| by LaTeX2e as placeholder for the
real code added by the \pkg{color} or \pkg{xcolor} package.
They are needed to handle colors inside saved boxes correctly.
See the definitions of \Macro\sbox for an example.
\begin{tabularx}{\linewidth}{lX}
\toprule
Macro & Definition given by \pkg{color} \\
\midrule
\Macro\color@begingroup & \leavevmode\Macro\begingroup \\
\Macro\color@endgroup & \leavevmode\Macro\endgroup \\
\Macro\color@setgroup & \leavevmode\Macro\begingroup\AlsoMacro\set@color \\
\Macro\color@hbox & \leavevmode\Macro\hbox\AlsoMacro\bgroup\AlsoMacro\color@begingroup \\
\Macro\color@vbox & \leavevmode\Macro\vbox\AlsoMacro\bgroup\AlsoMacro\color@begingroup \\
\Macro\color@endbox & \leavevmode\Macro\color@endgroup\AlsoMacro\egroup \\
\bottomrule
\end{tabularx}
\subsection{Auxiliary Macros}
This auxiliary macros were originally defined to handle font changes but can be used for other code as well.
\par\bigskip\noindent
\begin{tabularx}{\linewidth}{lX}
\toprule
Macro & Description \\
\midrule
\Macro\ifnot@nil{<1>}{<2>} & Checks if \meta{1} is the token \Macro\@nil. If so gobbles \meta{2}
otherwise uses \Macro\@firstofone to remove the braces around \meta{2}.\\
\Macro\@nil & This macro is undefined on purpose and used as endmarker in loops and other macros which process token lists. \\
\Macro\@nnil & Definition contains only \Macro\@nil and is used beside others to test for the presents of \Macro\@nil in \Macro\ifnot@nil. Is also used as endmarker.\\
\Macro\remove@to@nnil & Removes everything behind it until and including \Macro\@nnil.\\
\Macro\remove@star & Removes everything behind it until and including *.\\
\Macro\zap@space<text>!\verb*+ +!\AlsoMacro\@empty & Removes all spaces from \meta{text}. Expandable. \\
\Macro\strip@prefix & Removes everything up to and including to the next \texttt{>}. \\
\bottomrule
\end{tabularx}
\subsection{Catcodes}
\par\bigskip\noindent
\begin{tabularx}{\linewidth}{lX}
\toprule
Name & Description \\
\midrule
\Macro\@makeother{<letter>} & Changes the catcode of the letter to \q{other} (12). Special letters must be escaped with a backslash. \\
\Macro\@sanitize & Changes catcodes of everything except braces to \q{other} (12).\\
\Macro\@onelevel@sanitize<macro> & Sanitizes \meta{macro}, turns it definition into verbatim code. Resulting characters except spaces are in catcode \q{other} (12)! Uses \Macro\meaning and \Macro\strip@prefix. (With $\epsilon$-\TeX\ many applications can be replaced by \Macro\detokenize{<content>}.) \\
\bottomrule
\end{tabularx}
\subsection{Messages}
\DescribeMacro\MessageBreak
\noindent
Inside a message this macro create a new line followed by a continuation text. Outside it is equal to |\relax|.
\DescribeMacro\GenericInfo{<continuation>}{<message>}
\noindent
Prints \meta{message} to a log file. An included \Macro\MessageBreak\relax will cause a new line which start with \meta{continuation}.
\DescribeMacros
\hbox{\Macro\GenericError{<continuation>}{<error message>}}%
\hbox{\phantom{\ttfamily\textbackslash GenericError}\MacroArgs{<where to go for further information>}{<help text>}}%
\endDescribeMacros
\noindent
Print error message to log file followed by the \q{further information} line.
The help text is displayed if the user presses "h".
\DescribeMacro\wlog{<log message>}
\noindent
Write on log file only.
\subsection{Dimensions, Length and Skips}
\par\bigskip\noindent
\begin{tabularx}{\linewidth}{lX}
\toprule
Name & Description \\
\midrule
\Macro\@settopoint<register> & Rounds register to whole number of points. \\
\Macro\rem@pt<dimension value> & Awaits a value dimension value (\MacroArgs<int>'.'<frac>'pt') as string where the \Q{pt} is removed. If \meta{frac} is numerical equal to 0, then it and the decimal dot are removed as well. \\
\Macro\strip@pt<dimension> & Expands dimension using \cs{the} and strips the \Q{pt} using \Macro\rem@pt. \\
\Macro\@killglue &
Removes (|\unskip|s) the last and then all further skips (|\lastskip|) till one with a size of zero is reached. \\
\bottomrule
\end{tabularx}
\DescribeMacro\@defaultunits
\noindent
Used to provide a default unit for |dimen| or |skip| assignment.\\
Usage: |\@defaultunits\dimen=#1pt\relax\@nnil|.
Other units can be used instead of "pt".
\subsection{Class and Package Options}
\begin{tabularx}{\linewidth}{lX}
\toprule
Macro & Description \\
\midrule
\Macro\@classoptionslist & List of options of the main class. \\
\Macro\@unusedoptionlist & List of options to the main class that haven't been declared. \\
\Macro\@declaredoptions & Comma separated list of the options declared by the current package or class.
The list is in the order in which the options were declared. \\
\bottomrule
\end{tabularx}
\subsection{Files}
\begin{tabularx}{\linewidth}{lX}
\toprule
Macro & Description \\
\midrule
\Macro\if@filesw & If false the package should not be produce or write to output files. Set to false by \cs{nofiles}.\\
\Macro\if@partsw & \\
\Macro\@currdir & Holds the current directory, e.g. \Q{./} in an Unix OS. \\
\Macro\input@path & List of input paths. Each path should be enclosed in braces with no delimiters between paths. \\
\Macro\@filelist & The comma separated list of all files read so far. Only active if \cs{listfiles} is used in the preamble. \\
\Macro\@inputcheck& Input file handle to check for the existence of the file.\\
\Macro\@unused & Output file handle used to reserve the standard output. Used in \Macro\typeout to write to the terminal.\\
\Macro\@mainaux & Output file handle for the main \texttt{aux} file.\\
\Macro\@partaux & Output file handle for include file \texttt{aux} files.\\
\Macro\@auxout & Let to \Macro\@partaux inside include files, but to \Macro\@mainaux otherwise.\\
\Macro\@partlist & Holds the comma-separated list defined by \Macro\includeonly. \\
\Macro\@pushfilename & pushes file name, extension and current catcode of \Q{@} onto the file stack. \\
\Macro\@popfilename & pushes file name, extension and current catcode of \Q{@} onto the file stack. \\
\Macro\@currnamestack & file name stack.\\
\bottomrule
\end{tabularx}
\DescribeMacro\filename@parse{<filename>}
\noindent
Parses \meta{filename} and provides its directory, name base and extension in \Macro\filename@area,
\Macro\filename@base and \Macro\filename@ext. The latter is let to \Macro\relax if it does not
exists.
\DescribeMacro\@filef@und
The macro \Macro\IfFileExists (which is used by \Macro\InputIfFileExists) stores the found file followed by a space in this macro.
\DescribeMacro\@starttoc{<ext>}
\noindent
Reads the file with the given extension (\texttt{\string\jobname.}\meta{ext}) and opens it for
writing afterwards. The file is initially empty. Creates the output file handle \Macro\tf@<ext>.
\DescribeMacro\@writefile{<ext>}{<code>}
\noindent
Writes code using the output handle \Macro\tf@<ext> if it exists.
\DescribeMacro\@iffileonpath{<filename>}
\noindent
Check if given file is found by \TeX{} directly or in any of the directories given by \cs{input@path}.
\DescribeMacro\@obsoletefile{<new>}{<obsolete>}
\noindent
Prints warning message (only) that now a different file is used a input.
\DescribeMacro\@addtofilelist{<filename>}
\noindent
Adds the given filename to the list of files. Only active if \cs{listfiles} is used in the preamble.
\DescribeMacro\@ptionlist{<filename>}
\noindent
Expands the option list of package, class or file given by full filename.
\DescribeMacro\@ifpackageloaded{<package>}{<true>}{<false>}
\DescribeMacro\@ifclassloaded{<class>}{<true>}{<false>}
\DescribeMacro\@ifl@aded{<extension>}{<file base>}{<true>}{<false>}
Tests if given package/class/file has been loaded.
\DescribeMacros
\Macro\@ifpackagewith{<name>}{<option-list>}{<true>}{<false>}
\Macro\@ifclasswith{<name>}{<option-list>}{<true>}{<false>}
\Macro\@if@ptions{<extension>}{<name>}{<option-list>}{<true>}{<false>}
\endDescribeMacros
\noindent
Tests if given package/class/file has been loaded with the given options.
\DescribeMacros
\Macro\@ifpackagelater{<name>}{<date YYYY/MM/DD>}{<true>}{<false>}
\Macro\@ifclasslater{<name>}{<date YYYY/MM/DD>}{<true>}{<false>}
\Macro\@ifl@ter{<extension>}{<file base>}{<date YYYY/MM/DD>}{<true>}{<false>}
\endDescribeMacros
\noindent
Tests if given package/class/file has been loaded with a version more recent than \meta{version}.
\subsection{Saved plain\TeX{} primitives}
The following plain\TeX{} macros are redefined by \LaTeX{} and therefore saved away first:
\par\bigskip\noindent
\begin{tabularx}{\linewidth}{llX}
\toprule
\LaTeX{} Macro & plain\TeX{} original & Description/Note \\
\midrule
\Macro\@@par & \Macro{par} & Some \LaTeX{} environments redefine \Macro{par} locally \\
\Macro\@@input & \Macro\input & Syntax: \Macro\input~<filename> \\
\Macro\@@end & \Macro{end} & \\
\Macro\@@underline & \Macro\underline & \\
\Macro\frozen@everymath & \Macro\everymath & \\
\Macro\frozen@everydisplay & \Macro\everydisplay & \\
\bottomrule
\end{tabularx}
\subsection{Fonts}
\begin{tabularx}{\linewidth}{lX}
\toprule
Macro & Description \\
\midrule
\Macro\f@encoding & Holds the current font encoding. \\
\Macro\f@family & Holds the current font family. \\
\Macro\f@series & Holds the current font series. \\
\Macro\f@shape & Holds the current font shape. \\
\Macro\f@size & Holds the current font size (in pt but without unit). \\
\Macro\f@baselineskip & Holds the current baseline skip (in pt but without unit). \\
\Macro\f@linespread & Holds the current internal value for \Macro\baselinestretch. \\
\Macro\@currsize & Let to the last font size command (e.g.\ |\small|). \\
\Macro\curr@math@size & Holds locally the current math size. \\
\Macro\curr@fontshape & |\f@encoding /\f@family /\f@series /\f@shape| \\
\bottomrule
\end{tabularx}
\subsection{Paragraph}
\begin{tabularx}{\linewidth}{lX}
\toprule
Macro & Description \\
\midrule
\Macro\@@par & Plain\TeX{} primitive \cs{par}. \\
\Macro\@setpar{<val>} & Used to make environment-wide changes to \cs{par}. Sets both \cs{par} and \cs{@par} to \meta{val}. \\
\Macro\@restorepar & Defines \cs{par} to \cs{@par}. \\
\bottomrule
\end{tabularx}
\subsection{Space Hack}
\begin{tabularx}{\linewidth}{lX}
\toprule
Macro & Description \\
\midrule
\Macro\@bsphack & \\
\Macro\@esphack & Both of these macro ensure that the code between them does not insert any spaces into the document.
The code itself should not produce any text and not change the mode (e.g.\ start or stop math mode).\\
\Macro\@Esphack & Variant of \cs{@esphack} which sets the \texttt{@ignore} switch to true which causes an \cs{ignorespaces}
after the \cs{end} of the environment.\\
\Macro\@vbsphack & Variant of \cs{@bsphack} which ensure the invisible material is \emph{not} set in vmode. Not used by \LaTeX{} itself at the moment. \\
\bottomrule
\end{tabularx}
\subsection{Boxes}
\begin{tabularx}{\linewidth}{lX}
\toprule
Macro & Description \\
\midrule
\Macro\null & Empty \Macro\hbox. Good to fill places which must not be empty. \\
\Macro\strutbox & Box with dimension of |\strut|, i.e.\ maximum height and depth of the current font and zero width. Can be used to extract this dimension
with \texttt{\string\ht\string\strutbox} and \texttt{\string\dp\string\strutbox}. \\
\Macro\@arstrutbox & Defined inside array and tabular. Like \Macro\strutbox but stretched by \Macro\arraystretch. \\
\Macro\@begin@tempboxa<box>{<content>} & Stores \meta{content} into \Macro\@tempboxa as \meta{box} (\cs{hbox} or \cs{vbox}) and stores its dimension into \Macro\width, \Macro\height, \Macro\depth and \Macro\totalheight. \\
\Macro\@end@tempboxa & Ends a \Macro\@begin@tempboxa environment. \\
\Macro\hb@xt@ & \Macro\hbox~'to' \\
\Macro\hmode@bgroup & \Macro\leavevmode\AlsoMacro\bgroup \\
\bottomrule
\end{tabularx}
\DescribeMacro\@settodim{<dimension cs>}{<length register>}{<content>}
Sets the \meta{length register} to the dimension given by the \meta{dimension} (\Macro\ht, \Macro\dp and \Macro\wd\relax) of the \meta{content}.
Example: \Macro\@settodim{\Macro\wd}{\Macro\@tempdima}{Hello World}
will set \Macro\@tempdima to the width of \qq{Hello World}.
\subsection{Base Conversion}
\begin{tabularx}{\linewidth}{lX}
\toprule
Macro & Description \\
\midrule
\Macro\hexnumber@{<number>} & Returns a single digit hexadecimal number (\mbox{0--9}, \mbox{A--F}) from given \meta{number}, which must either be a numeric register or a number ending with a space! \\
\Macro\@alph{<number>} & Expands to lower case letter corresponding to the given number (1=a, 2=b, \ldots). Expands to \Macro\@ctrerr if number is larger then~26.\\
\Macro\@Alph{<number>} & Expands to upper case letter corresponding to the given number (1=A, 2=B, \ldots). Expands to \Macro\@ctrerr if number is larger then~26.\\
\Macro\two@digits{<number>} &
Returns \meta{number} (e.g.\ a \texttt{count} register) as string and ensures that it has at least two digits
by appending a "0" if required. \\
\bottomrule
\end{tabularx}
\subsection{Conditionals}
\begin{tabularx}{\linewidth}{lX}
\toprule
Macro & Description \\
\midrule
\Macro{if@compatibility} & Switch to indicate if the LaTeX2.09 compatibility mode is active. \\
\Macro{if@ignore} & Whether or not to ignore spaces after an environment. Set to true by \Macro\ignorespacesafterend.\\
\Macro{if@minipage} & True for a \texttt{minipage}, false for a \texttt{parbox}. Responsible for adding space, skips and paragraph indents for a \texttt{parbox}.\\
\Macro{if@twoside} & True for two-sided documents \\
\Macro{if@twocolumn} & Indicates if two-column mode is active \\
\Macro{if@firstcolumn}& Indicates if the first column is processed \\
\bottomrule
\end{tabularx}
% ToDo Check footnote makros
\end{document}
|