#!/usr/bin/perl use strict; use warnings; sub help { my $cmdname = $0; $cmdname =~ s:.*/::; print "$cmdname -- check LaTeX files.\n"; print " -help Show this help.\n"; print " -defs=FILE Use definitions in this file when checking others.\n"; print " -v Verbose output for debugging this command.\n"; print "\n"; print "Checks for:\n"; print " * backslashes at the end of a line\n"; print " * non-ASCCI characters (suggests a LaTeX character for most)\n"; print " * \\begin-\\end nesting\n"; print " * curly brace { } nesting\n"; print " * undefined commands and counters\n"; print " * commands and counters defined but not used\n"; } if (!@ARGV) { &help; exit 0; } my $arg; my $fname = ""; my $lineno = 0; my %builtin = (); my %commandsHash = (); my %newCommandsHash = (); my %defaultNewCommandsHash = (); my @braceStack = (); my $v = ""; my $saveCommands = ""; &setup; foreach $arg (@ARGV) { if ($arg =~ /^-+help/) { &help; exit 0; } elsif ($arg =~ /^-+v$/) { $v = "y"; } elsif ($arg =~ /^-+defs=(.+)$/) { $fname = $arg; $fname =~ s/^-+defs=(.+)$/$1/; open FILE, "<$fname"; $saveCommands = "y"; &latexFile; $saveCommands = ""; close FILE; } elsif ($arg =~ /^-+.*/) { print "Unexpected option \"$arg\".\n"; exit -1; } else { $fname = $arg; open FILE, "<$fname"; &latexFile; close FILE; } } # Handle a single file sub latexFile { print "Checking $fname\n"; my $indent = ""; %commandsHash = (); %newCommandsHash = (); $lineno = 0; while () { ++$lineno; if ($v) { print "($fname:$lineno)\n"; } chomp; if (/\\\\$/) { # do nothing } elsif (/\\$/) { print "($fname:$lineno) Backslash at end of line.\n"; } &decomment; #print "b"; &badChars; #print "A"; &braceCheck; #print "c"; &findCommands; #print "d"; if (/\\begin{/) { my $env = $_; $env =~ s/.*\\begin{([^}]*)}.*/$1/; my $envPattern = $env; if ($envPattern =~ /\*/) { $envPattern =~ s/\*/\\*/; } my $rest = $_; $rest =~ s/.*\\begin{([^}]*)}//; if ($rest =~ /$envPattern/) { } else { #print "($fname:$lineno) ${indent}Found \\begin{$env}, looking for \\end{$env}.\n"; &balance("\\\\end{$envPattern}", "\\end{$env}", $indent, "($fname:$lineno)"); } } } &exiting; } # Look for bad characters in $_ sub badChars { #print "badchars "; # Apparently Perl uses some non-ascii characters as regex metacharacters internally. if (/Þ/) { print "($fname:$lineno) Non-ascii `Þ' instead of `fi'.\n"; } #print "a"; #if (/?/) { print "($fname:$lineno) Non-ascii `?' instead of `ff'.\n"; } #if (/?/) { print "($fname:$lineno) Non-ascii `?' instead of `ffi'.\n"; } if (/Ò/) { print "($fname:$lineno) Non-ascii `Ò' (left double quote) instead of \"``\".\n"; } #print "b"; if (/Ó/) { print "($fname:$lineno) Non-ascii `Ó' (right double quote) instead of \"''\".\n"; } #print "c"; if (/Ô/) { print "($fname:$lineno) Non-ascii `Ô' (left single quote) instead of \"``\".\n"; } #print "d"; if (/Õ/) { print "($fname:$lineno) Non-ascii `Õ' (right single quote) instead of \"''\".\n"; } #print "e"; if (/Ñ/) { print "($fname:$lineno) Non-ascii `Ñ' instead of `---'.\n"; } #print "f"; if (/Ð/) { print "($fname:$lineno) Non-ascii `Ð' instead of `--'.\n"; } #print "g"; if (/Â/) { print "($fname:$lineno) Non-ascii `Â' instead of `\\-'.\n"; } #print "h"; #if (/?/) { print "($fname:$lineno) Non-ascii `?' (m-space) instead of ` '.\n"; } #if (/?/) { print "($fname:$lineno) Non-ascii `?' (n-space) instead of ` '.\n"; } if (/É/) { print "($fname:$lineno) Non-ascii `É' instead of `...'.\n"; } # Other likely misuses if (/ - /) { print "($fname:$lineno) Hyphen '-' instead of dash.\n"; } if (/ -- /) { print "($fname:$lineno) N-dash '--' instead of m-dash.\n"; } #print "i\n"; } # Balance \begins and \ends sub balance { my $pattern = $_[0]; my $echo = $_[1]; my $indent = $_[2]; my $from = $_[3]; while () { ++$lineno; chomp; &decomment; &badChars; &braceCheck; &findCommands; if (/\\begin{/) { my $env = $_; $env =~ s/.*\\begin{([^}]*)}.*/$1/; my $envPattern = $env; if ($envPattern =~ /\*/) { $envPattern =~ s/\*/\\*/; } my $rest = $_; $rest =~ s/.*\\begin{([^}]*)}//; if ($rest =~ /$envPattern/) { } else { #print "($fname:$lineno) ${indent}Found \\begin{$env}, looking for \\end{$env}.\n"; &balance("\\\\end{$envPattern}", "\\end{$env}", $indent, "($fname:$lineno)"); } } elsif (/$pattern/) { #print "($fname:$lineno) ${indent}Found $echo.\n"; return; } elsif (/\\end{[^}]*}/) { my $unbegun = $_; $unbegun =~ s/.*(\\end{[^}]*}).*/$1/; print "($fname:$lineno) ${indent}Unexpected `$unbegun' while seeking `$echo' begun at $from.\n"; &exiting; } } print "($fname:$lineno) ${indent}End-of-file while seeking `$echo' begun at $from.\n"; &exiting; } # Keep track of brace balancing in $_ in successive calls (one per line read) sub braceCheck { # Braces can't span paragraphs, apparently if ($_ eq "") { if (scalar @braceStack) { my $from = $braceStack[(scalar @braceStack) - 1]; $from =~ s/ \([^:]*:([0-9]+)\).*/$1/; &exiting("($fname:$lineno) Unexpected blank line (new paragraph) before brace from line $from was closed.\n"); } return; } my $work = $_; while ($work =~ /[{}]/) { $work =~ s/^[^{}]+//; if ($work =~ /^\{/) { push @braceStack, " ($fname:$lineno) `$work'\n"; } elsif ($work =~ /^}/) { if (@braceStack) { pop @braceStack; } else { &exiting("Unmatched '}':\n ($fname:$lineno) `$work'.\n"); } } else { # About to exit the loop, presumably. } $work =~ s/^.//; } } # Elide comments sub decomment { if (/^%/) { s/^%.*/ /; } elsif (/([^\\])%/) { s/([^\\])%.*/$1%/; #print "Escaped percent: $_\n"; } } # Exit but don't forget pending problems sub exiting { &undefineds; if ($saveCommands) { # do nothing } else { &unuseds; } if (@braceStack) { print "Braces unmatched at end of file:\n"; while (@braceStack) { print pop @braceStack; } } while (@_) { print pop @_; } # exit; } # Find a command in $_ sub findCommands { my $work = $_; while ($work =~ /\\/) { $work =~ s/[^\\]*//; my $cmd = $work; if ($work =~ /^(\\[\$a-zA-Z])/) { $cmd =~ s/^(\\.[^]\\{}`~!@#\$^&*()_+=[|:;"'<,>.?\/ 0-9-]*).*/$1/; $work =~ s/^(\\.[^]\\{}`~!@#\$^&*()_+=[|:;"'<,>.?\/ 0-9-]*)//; if ($v) { print "($fname:$lineno) Found command \"$cmd\".\n"; } } else { $cmd =~ s/(\\.).*/$1/; $work =~ s/(\\.)//; } $commandsHash{$cmd} = "($fname:$lineno)"; } if (/\\newcommand/) { my $newcommand = $_; $newcommand =~ s/.*\\newcommand{(\\[^}]*)}.*/$1/; $newCommandsHash{$newcommand} = "($fname:$lineno)"; if ($saveCommands) { $defaultNewCommandsHash{$newcommand} = "($fname:$lineno)"; } if ($v) { print "($fname:$lineno) Found new command \"$newcommand\".\n"; } } if (/\\newcounter/) { my $newcommand = $_; $newcommand =~ s/.*\\newcounter{([^}]*)}.*/\\the$1/; $newCommandsHash{"$newcommand"} = "($fname:$lineno)"; if ($saveCommands) { $defaultNewCommandsHash{"$newcommand"} = "($fname:$lineno)"; } if ($v) { print "($fname:$lineno) Found new counter \"$newcommand\".\n"; } } } # Did we find any undefined commands? sub undefineds { my @commandList = reverse sort keys %commandsHash; while (@commandList) { my $cmd = pop @commandList; if (exists $builtin{$cmd}) { } elsif (exists $newCommandsHash{$cmd}) { } elsif (exists $defaultNewCommandsHash{$cmd}) { } else { print "Undefined: $cmd $commandsHash{$cmd}\n"; } } } # Did we find any definitions of commands that were never used? sub unuseds { my @commandList = reverse sort keys %newCommandsHash; while (@commandList) { my $cmd = pop @commandList; if (exists $commandsHash{$cmd} && exists $newCommandsHash{$cmd} && $commandsHash{$cmd} eq $newCommandsHash{$cmd}) { print "Unused: $cmd $newCommandsHash{$cmd}\n"; } else { #print "Used: $cmd $newCommandsHash{$cmd}\n"; } } } sub setup { %builtin = ( # Lamport ("\\ ", "(builtin)"), ("\\!", "(builtin)"), ("\\#", "(builtin)"), ("\\%", "(builtin)"), ("\\&", "(builtin)"), ("\\'", "(builtin)"), ("\\*", "(builtin)"), ("\\*[", "(builtin)"), ("\\+", "(builtin)"), ("\\,", "(builtin)"), ("\\-", "(builtin)"), ("\\.", "(builtin)"), ("\\:", "(builtin)"), ("\\;", "(builtin)"), ("\\<", "(builtin)"), ("\\=", "(builtin)"), ("\\>", "(builtin)"), ("\\Alph", "(builtin)"), ("\\Bbb", "(builtin)"), ("\\Bbbk", "(builtin)"), ("\\Bumpeq", "(builtin)"), ("\\Cap", "(builtin)"), ("\\Cup", "(builtin)"), ("\\Delta", "(builtin)"), ("\\Downarrow", "(builtin)"), ("\\Finv", "(builtin)"), ("\\Game", "(builtin)"), ("\\Gamma", "(builtin)"), ("\\H", "(builtin)"), ("\\Huge", "(builtin)"), ("\\Im", "(builtin)"), ("\\LARGE", "(builtin)"), ("\\LaTeX", "(builtin)"), ("\\Lambda", "(builtin)"), ("\\Large", "(builtin)"), ("\\Leftarrow", "(builtin)"), ("\\Leftrightarrow", "(builtin)"), ("\\Lleftarrow", "(builtin)"), ("\\Longleftarrow", "(builtin)"), ("\\Longleftrightarrow", "(builtin)"), ("\\Longrightarrow", "(builtin)"), ("\\Lsh", "(builtin)"), ("\\Omega", "(builtin)"), ("\\P", "(builtin)"), ("\\Phi", "(builtin)"), ("\\Pi", "(builtin)"), ("\\Pr", "(builtin)"), ("\\Psi", "(builtin)"), ("\\Re", "(builtin)"), ("\\Rightarrow", "(builtin)"), ("\\Roman", "(builtin)"), ("\\Rsh", "(builtin)"), ("\\S", "(builtin)"), ("\\Sigma", "(builtin)"), ("\\Subset", "(builtin)"), ("\\Supset", "(builtin)"), ("\\TeX", "(builtin)"), ("\\Theta", "(builtin)"), ("\\Uparrow", "(builtin)"), ("\\Updownarrow", "(builtin)"), ("\\Upsilon", "(builtin)"), ("\\Vdash", "(builtin)"), ("\\Vvdash", "(builtin)"), ("\\Xi", "(builtin)"), ("\\[", "(builtin)"), ("\\\"", "(builtin)"), ("\\\$", "(builtin)"), ("\\\@", "(builtin)"), ("\\\\", "(builtin)"), ("\\]", "(builtin)"), ("\\^", "(builtin)"), ("\\_", "(builtin)"), ("\\`", "(builtin)"), ("\\a'", "(builtin)"), ("\\a=", "(builtin)"), ("\\a`", "(builtin)"), ("\\abovedisplayshortskip", "(builtin)"), ("\\abovedisplayskip", "(builtin)"), ("\\acute", "(builtin)"), ("\\addcontentsline", "(builtin)"), ("\\addtocontents", "(builtin)"), ("\\addtocounter", "(builtin)"), ("\\addtolength", "(builtin)"), ("\\addvspace", "(builtin)"), ("\\advancepageno", "(builtin)"), ("\\aleph", "(builtin)"), ("\\alph", "(builtin)"), ("\\alpha", "(builtin)"), ("\\amalg", "(builtin)"), ("\\angle", "(builtin)"), ("\\appendix", "(builtin)"), ("\\approx", "(builtin)"), ("\\approxeq", "(builtin)"), ("\\arabic", "(builtin)"), ("\\arccos", "(builtin)"), ("\\arcsin", "(builtin)"), ("\\arctan", "(builtin)"), ("\\arg", "(builtin)"), ("\\arraycolsep", "(builtin)"), ("\\arrayrulewidth", "(builtin)"), ("\\arraystgretch", "(builtin)"), ("\\ast", "(builtin)"), ("\\asymp", "(builtin)"), ("\\author", "(builtin)"), ("\\b", "(builtin)"), ("\\backprime", "(builtin)"), ("\\backsim", "(builtin)"), ("\\backsimeq", "(builtin)"), ("\\backslash", "(builtin)"), ("\\bar", "(builtin)"), ("\\barwedge", "(builtin)"), ("\\baselineskip", "(builtin)"), ("\\baselinestretch", "(builtin)"), ("\\because", "(builtin)"), ("\\begin", "(builtin)"), ("\\beginsection", "(builtin)"), ("\\belowdisplayshortskip", "(builtin)"), ("\\belowdisplayskip", "(builtin)"), ("\\beta", "(builtin)"), ("\\beth", "(builtin)"), ("\\between", "(builtin)"), ("\\bfseries", "(builtin)"), ("\\bibindent", "(builtin)"), ("\\bibliography", "(builtin)"), ("\\bibliographystyle", "(builtin)"), ("\\bigcap", "(builtin)"), ("\\bigcirc", "(builtin)"), ("\\bigcup", "(builtin)"), ("\\bigodot", "(builtin)"), ("\\bigoplus", "(builtin)"), ("\\bigotimes", "(builtin)"), ("\\bigskip", "(builtin)"), ("\\bigsqcup", "(builtin)"), ("\\bigstar", "(builtin)"), ("\\bigtriangledown", "(builtin)"), ("\\bigtriangleup", "(builtin)"), ("\\biguplus", "(builtin)"), ("\\bigvee", "(builtin)"), ("\\bigwedge", "(builtin)"), ("\\blacklozenge", "(builtin)"), ("\\blacksquare", "(builtin)"), ("\\blacktriangle", "(builtin)"), ("\\blacktriangledown", "(builtin)"), ("\\blacktriangleleft", "(builtin)"), ("\\blacktriangleright", "(builtin)"), ("\\bmod", "(builtin)"), ("\\boldmath", "(builtin)"), ("\\boldsymbol", "(builtin)"), ("\\boolean", "(builtin)"), ("\\bot", "(builtin)"), ("\\bottomfraction", "(builtin)"), ("\\bottomnumber", "(builtin)"), ("\\bowtie", "(builtin)"), ("\\boxdot", "(builtin)"), ("\\boxminus", "(builtin)"), ("\\boxplus", "(builtin)"), ("\\boxtimes", "(builtin)"), ("\\breve", "(builtin)"), ("\\bullet", "(builtin)"), ("\\bumpeq", "(builtin)"), ("\\bye", "(builtin)"), ("\\c", "(builtin)"), ("\\cap", "(builtin)"), ("\\caption", "(builtin)"), ("\\caption[", "(builtin)"), ("\\cdot", "(builtin)"), ("\\cdots", "(builtin)"), ("\\centerdot", "(builtin)"), ("\\centering", "(builtin)"), ("\\chapter", "(builtin)"), ("\\chapter*", "(builtin)"), ("\\chapter[", "(builtin)"), ("\\check", "(builtin)"), ("\\chi", "(builtin)"), ("\\circ", "(builtin)"), ("\\circeq", "(builtin)"), ("\\circle", "(builtin)"), ("\\circle*", "(builtin)"), ("\\circlearrowleft", "(builtin)"), ("\\circlearrowright", "(builtin)"), ("\\circledS", "(builtin)"), ("\\circledast", "(builtin)"), ("\\circledcirc", "(builtin)"), ("\\circleddash", "(builtin)"), ("\\cite", "(builtin)"), ("\\cite[", "(builtin)"), ("\\cleardoublepage", "(builtin)"), ("\\clearpage", "(builtin)"), ("\\cleartabs", "(builtin)"), ("\\cline", "(builtin)"), ("\\clubsuit", "(builtin)"), ("\\color", "(builtin)"), ("\\colorbox", "(builtin)"), ("\\columnsep", "(builtin)"), ("\\columnseprule", "(builtin)"), ("\\columnwidth", "(builtin)"), ("\\complement", "(builtin)"), ("\\cong", "(builtin)"), ("\\coprod", "(builtin)"), ("\\copyright", "(builtin)"), ("\\cos", "(builtin)"), ("\\cosh", "(builtin)"), ("\\cot", "(builtin)"), ("\\coth", "(builtin)"), ("\\csc", "(builtin)"), ("\\cup", "(builtin)"), ("\\curlyeqprec", "(builtin)"), ("\\curlyeqsucc", "(builtin)"), ("\\curlyvee", "(builtin)"), ("\\curlywedge", "(builtin)"), ("\\curvearrowleft", "(builtin)"), ("\\curvearrowright", "(builtin)"), ("\\d", "(builtin)"), ("\\dag", "(builtin)"), ("\\dagger", "(builtin)"), ("\\daleth", "(builtin)"), ("\\dashbox", "(builtin)"), ("\\dashleftarrow", "(builtin)"), ("\\dashrightarrow", "(builtin)"), ("\\dashv", "(builtin)"), ("\\date", "(builtin)"), ("\\dblfloatpagefraction", "(builtin)"), ("\\dblfloatsep", "(builtin)"), ("\\dbltextfloatsep", "(builtin)"), ("\\dbltopfraction", "(builtin)"), ("\\ddag", "(builtin)"), ("\\ddagger", "(builtin)"), ("\\ddot", "(builtin)"), ("\\ddots", "(builtin)"), ("\\definecolor", "(builtin)"), ("\\deg", "(builtin)"), ("\\delta", "(builtin)"), ("\\depth", "(builtin)"), ("\\det", "(builtin)"), ("\\diagdown", "(builtin)"), ("\\diagup", "(builtin)"), ("\\diamond", "(builtin)"), ("\\diamondsuit", "(builtin)"), ("\\digamma", "(builtin)"), ("\\dim", "(builtin)"), ("\\displaystyle", "(builtin)"), ("\\div", "(builtin)"), ("\\divideontimes", "(builtin)"), ("\\documentclass", "(builtin)"), ("\\documentclass[", "(builtin)"), ("\\dosupereject", "(builtin)"), ("\\dot", "(builtin)"), ("\\doteq", "(builtin)"), ("\\doteqdot", "(builtin)"), ("\\dotplus", "(builtin)"), ("\\doublebarwedge", "(builtin)"), ("\\doublerulesep", "(builtin)"), ("\\downarrow", "(builtin)"), ("\\downdownarrows", "(builtin)"), ("\\downharpoonleft", "(builtin)"), ("\\downharpoonright", "(builtin)"), ("\\ell", "(builtin)"), ("\\emph", "(builtin)"), ("\\emptyset", "(builtin)"), ("\\end", "(builtin)"), ("\\endinsert", "(builtin)"), ("\\enlargethispage", "(builtin)"), ("\\enlargethispage*", "(builtin)"), ("\\ensuremath", "(builtin)"), ("\\epsilon", "(builtin)"), ("\\eqalign", "(builtin)"), ("\\eqalignno", "(builtin)"), ("\\eqcirc", "(builtin)"), ("\\eqslantgtr", "(builtin)"), ("\\eqslantless", "(builtin)"), ("\\equal", "(builtin)"), ("\\equiv", "(builtin)"), ("\\eta", "(builtin)"), ("\\eth", "(builtin)"), ("\\exists", "(builtin)"), ("\\exp", "(builtin)"), ("\\fallingdotseq", "(builtin)"), ("\\fbox", "(builtin)"), ("\\fboxrule", "(builtin)"), ("\\fboxsep", "(builtin)"), ("\\fcolorbox", "(builtin)"), ("\\fill", "(builtin)"), ("\\fivebf", "(builtin)"), ("\\fivei", "(builtin)"), ("\\fiverm", "(builtin)"), ("\\fivesy", "(builtin)"), ("\\flat", "(builtin)"), ("\\floatpagefraction", "(builtin)"), ("\\floatsep", "(builtin)"), ("\\fnsymbol", "(builtin)"), ("\\folio", "(builtin)"), ("\\footline", "(builtin)"), ("\\footnote", "(builtin)"), ("\\footnote[", "(builtin)"), ("\\footnotemark", "(builtin)"), ("\\footnotemark[", "(builtin)"), ("\\footnoterule", "(builtin)"), ("\\footnotesep", "(builtin)"), ("\\footnotesize", "(builtin)"), ("\\footnotetext", "(builtin)"), ("\\footnotetext[", "(builtin)"), ("\\footstrut", "(builtin)"), ("\\forall", "(builtin)"), ("\\frac", "(builtin)"), ("\\fragile", "(builtin)"), ("\\frak", "(builtin)"), ("\\frame", "(builtin)"), ("\\framebox", "(builtin)"), ("\\framebox(", "(builtin)"), ("\\framebox[", "(builtin)"), ("\\frenchspacing", "(builtin)"), ("\\frown", "(builtin)"), ("\\fussy", "(builtin)"), ("\\gamma", "(builtin)"), ("\\gcd", "(builtin)"), ("\\geq", "(builtin)"), ("\\geqq", "(builtin)"), ("\\geqslant", "(builtin)"), ("\\gg", "(builtin)"), ("\\ggg", "(builtin)"), ("\\gimel", "(builtin)"), ("\\glossary", "(builtin)"), ("\\gnapprox", "(builtin)"), ("\\gneq", "(builtin)"), ("\\gneqq", "(builtin)"), ("\\gnsim", "(builtin)"), ("\\graphpaper(", "(builtin)"), ("\\graphpaper[", "(builtin)"), ("\\grave", "(builtin)"), ("\\gtrapprox", "(builtin)"), ("\\gtrdot", "(builtin)"), ("\\gtreqless", "(builtin)"), ("\\gtreqqless", "(builtin)"), ("\\gtrless", "(builtin)"), ("\\gtrsim", "(builtin)"), ("\\gvertneqq", "(builtin)"), ("\\hat", "(builtin)"), ("\\hbar", "(builtin)"), ("\\headline", "(builtin)"), ("\\heartsuit", "(builtin)"), ("\\height", "(builtin)"), ("\\hfill", "(builtin)"), ("\\hline", "(builtin)"), ("\\hom", "(builtin)"), ("\\hookleftarrow", "(builtin)"), ("\\hookrightarrow", "(builtin)"), ("\\hslash", "(builtin)"), ("\\hspace", "(builtin)"), ("\\hspace*", "(builtin)"), ("\\huge", "(builtin)"), ("\\hyphenation", "(builtin)"), ("\\ifthenelse", "(builtin)"), ("\\imath", "(builtin)"), ("\\in", "(builtin)"), ("\\include", "(builtin)"), ("\\includegraphics", "(builtin)"), ("\\includegraphics*", "(builtin)"), ("\\includegraphics*[", "(builtin)"), ("\\includegraphics[", "(builtin)"), ("\\includeonly", "(builtin)"), ("\\indent", "(builtin)"), ("\\index", "(builtin)"), ("\\inf", "(builtin)"), ("\\infty", "(builtin)"), ("\\input", "(builtin)"), ("\\int", "(builtin)"), ("\\intercal", "(builtin)"), ("\\intextsep", "(builtin)"), ("\\iota", "(builtin)"), ("\\isodd", "(builtin)"), ("\\item", "(builtin)"), ("\\item[", "(builtin)"), ("\\itemindent", "(builtin)"), ("\\itemsep", "(builtin)"), ("\\itshape", "(builtin)"), ("\\jmath", "(builtin)"), ("\\jot", "(builtin)"), ("\\kappa", "(builtin)"), ("\\ker", "(builtin)"), ("\\kill", "(builtin)"), ("\\label", "(builtin)"), ("\\labelsep", "(builtin)"), ("\\labelwidth", "(builtin)"), ("\\lambda", "(builtin)"), ("\\large", "(builtin)"), ("\\ldots", "(builtin)"), ("\\left(", "(builtin)"), ("\\left)", "(builtin)"), ("\\left/", "(builtin)"), ("\\left[", "(builtin)"), ("\\left\\(", "(builtin)"), ("\\left\\)", "(builtin)"), ("\\left\\Downarrow", "(builtin)"), ("\\left\\Uparrow", "(builtin)"), ("\\left\\Updownarrow", "(builtin)"), ("\\left\\backslash", "(builtin)"), ("\\left\\downarrow", "(builtin)"), ("\\left\\langle", "(builtin)"), ("\\left\\lceil", "(builtin)"), ("\\left\\lfloor", "(builtin)"), ("\\left\\rangle", "(builtin)"), ("\\left\\rceil", "(builtin)"), ("\\left\\rfloor", "(builtin)"), ("\\left\\uparrow", "(builtin)"), ("\\left\\updownarrow", "(builtin)"), ("\\left\\|", "(builtin)"), ("\\left]", "(builtin)"), ("\\leftarrow", "(builtin)"), ("\\leftarrowtail", "(builtin)"), ("\\lefteqn", "(builtin)"), ("\\leftharpoondown", "(builtin)"), ("\\leftharpoonup", "(builtin)"), ("\\leftleftarrows", "(builtin)"), ("\\leftmargin", "(builtin)"), ("\\leftmargini", "(builtin)"), ("\\leftmarginii", "(builtin)"), ("\\leftmarginiii", "(builtin)"), ("\\leftmarginiv", "(builtin)"), ("\\leftmarginv", "(builtin)"), ("\\leftmarginvi", "(builtin)"), ("\\leftrightarrow", "(builtin)"), ("\\leftrightarrows", "(builtin)"), ("\\leftrightharpoons", "(builtin)"), ("\\leftrightsquigarrow", "(builtin)"), ("\\leftthreetimes", "(builtin)"), ("\\left|", "(builtin)"), ("\\lengthtest", "(builtin)"), ("\\leq", "(builtin)"), ("\\leqalignno", "(builtin)"), ("\\leqq", "(builtin)"), ("\\leqslant", "(builtin)"), ("\\lessapprox", "(builtin)"), ("\\lessdot", "(builtin)"), ("\\lesseqgtr", "(builtin)"), ("\\lesseqqgtr", "(builtin)"), ("\\lessgtr", "(builtin)"), ("\\lesssim", "(builtin)"), ("\\lg", "(builtin)"), ("\\lim", "(builtin)"), ("\\liminf", "(builtin)"), ("\\limsup", "(builtin)"), ("\\line(", "(builtin)"), ("\\linebreak", "(builtin)"), ("\\linebreak[", "(builtin)"), ("\\linethickness", "(builtin)"), ("\\linewidth", "(builtin)"), ("\\listfiles", "(builtin)"), ("\\listoffigures", "(builtin)"), ("\\listoftables", "(builtin)"), ("\\listparindent", "(builtin)"), ("\\ll", "(builtin)"), ("\\llcorner", "(builtin)"), ("\\lll", "(builtin)"), ("\\ln", "(builtin)"), ("\\lnapprox", "(builtin)"), ("\\lneq", "(builtin)"), ("\\lneqq", "(builtin)"), ("\\lnsim", "(builtin)"), ("\\log", "(builtin)"), ("\\longleftarrow", "(builtin)"), ("\\longleftrightarrow", "(builtin)"), ("\\longmapsto", "(builtin)"), ("\\longrightarrow", "(builtin)"), ("\\looparrowleft", "(builtin)"), ("\\looparrowright", "(builtin)"), ("\\lozenge", "(builtin)"), ("\\lrcorner", "(builtin)"), ("\\ltimes", "(builtin)"), ("\\lvertneqq", "(builtin)"), ("\\magnification", "(builtin)"), ("\\makebox", "(builtin)"), ("\\makebox(", "(builtin)"), ("\\makebox[", "(builtin)"), ("\\makefootline", "(builtin)"), ("\\makeglossary", "(builtin)"), ("\\makeheadline", "(builtin)"), ("\\makeindex", "(builtin)"), ("\\makelabel", "(builtin)"), ("\\maketitle", "(builtin)"), ("\\mapsto", "(builtin)"), ("\\marginpar", "(builtin)"), ("\\marginpar[", "(builtin)"), ("\\marginparpush", "(builtin)"), ("\\marginparsep", "(builtin)"), ("\\marginparwidth", "(builtin)"), ("\\markboth", "(builtin)"), ("\\markright", "(builtin)"), ("\\mathbf", "(builtin)"), ("\\mathcal", "(builtin)"), ("\\mathindent", "(builtin)"), ("\\mathit", "(builtin)"), ("\\mathrm", "(builtin)"), ("\\mathsf", "(builtin)"), ("\\mathtt", "(builtin)"), ("\\max", "(builtin)"), ("\\mbox", "(builtin)"), ("\\mdseries", "(builtin)"), ("\\measuredangle", "(builtin)"), ("\\medskip", "(builtin)"), ("\\mho", "(builtin)"), ("\\mid", "(builtin)"), ("\\midinsert", "(builtin)"), ("\\min", "(builtin)"), ("\\models", "(builtin)"), ("\\mp", "(builtin)"), ("\\mu", "(builtin)"), ("\\multicolumn", "(builtin)"), ("\\multimap", "(builtin)"), ("\\multiput(", "(builtin)"), ("\\nLeftarrow", "(builtin)"), ("\\nLeftrightarrow", "(builtin)"), ("\\nRightarrow", "(builtin)"), ("\\nVDash", "(builtin)"), ("\\nabla", "(builtin)"), ("\\natural", "(builtin)"), ("\\ncong", "(builtin)"), ("\\nearrow", "(builtin)"), ("\\neg", "(builtin)"), ("\\neq", "(builtin)"), ("\\newcommand", "(builtin)"), ("\\newcounter", "(builtin)"), ("\\newenvironment", "(builtin)"), ("\\newlength", "(builtin)"), ("\\newpage", "(builtin)"), ("\\newsavebox", "(builtin)"), ("\\newtheorem", "(builtin)"), ("\\nexists", "(builtin)"), ("\\ngeq", "(builtin)"), ("\\ngeqq", "(builtin)"), ("\\ngeqslant", "(builtin)"), ("\\ngtr", "(builtin)"), ("\\ni", "(builtin)"), ("\\nleftarrow", "(builtin)"), ("\\nleftrightarrow", "(builtin)"), ("\\nleq", "(builtin)"), ("\\nleqq", "(builtin)"), ("\\nleqslant", "(builtin)"), ("\\nless", "(builtin)"), ("\\nmid", "(builtin)"), ("\\nocite", "(builtin)"), ("\\noindent", "(builtin)"), ("\\nolinebreak", "(builtin)"), ("\\nolinebreak[", "(builtin)"), ("\\nonfrenchspacing", "(builtin)"), ("\\nopagebreak", "(builtin)"), ("\\nopagebreak[", "(builtin)"), ("\\nopagenumbers", "(builtin)"), ("\\normalbottom", "(builtin)"), ("\\normalfont", "(builtin)"), ("\\normalmarginpar", "(builtin)"), ("\\normalsize", "(builtin)"), ("\\notin", "(builtin)"), ("\\nparallel", "(builtin)"), ("\\nprec", "(builtin)"), ("\\npreceq", "(builtin)"), ("\\nrightarrow", "(builtin)"), ("\\nshortmid", "(builtin)"), ("\\nshortparallel", "(builtin)"), ("\\nsim", "(builtin)"), ("\\nsubseteq", "(builtin)"), ("\\nsucc", "(builtin)"), ("\\nsucceq", "(builtin)"), ("\\nsupseteq", "(builtin)"), ("\\nsupseteqq", "(builtin)"), ("\\ntriangleleft", "(builtin)"), ("\\ntrianglelefteq", "(builtin)"), ("\\ntriangleright", "(builtin)"), ("\\ntrianglerighteq", "(builtin)"), ("\\nu", "(builtin)"), ("\\nvDash", "(builtin)"), ("\\nvdash", "(builtin)"), ("\\nwarrow", "(builtin)"), ("\\odot", "(builtin)"), ("\\oint", "(builtin)"), ("\\oldstyle", "(builtin)"), ("\\omega", "(builtin)"), ("\\ominus", "(builtin)"), ("\\onecolumn", "(builtin)"), ("\\oplus", "(builtin)"), ("\\oslash", "(builtin)"), ("\\otimes", "(builtin)"), ("\\oval(", "(builtin)"), ("\\oval[", "(builtin)"), ("\\overline", "(builtin)"), ("\\pagebody", "(builtin)"), ("\\pagebreak", "(builtin)"), ("\\pagebreak[", "(builtin)"), ("\\pagecolor", "(builtin)"), ("\\pagecontents", "(builtin)"), ("\\pageinsert", "(builtin)"), ("\\pageno", "(builtin)"), ("\\pagenumbering", "(builtin)"), ("\\pageref", "(builtin)"), ("\\pagestyle", "(builtin)"), ("\\par", "(builtin)"), ("\\paragraph", "(builtin)"), ("\\paragraph*", "(builtin)"), ("\\paragraph[", "(builtin)"), ("\\parallel", "(builtin)"), ("\\parbox", "(builtin)"), ("\\parbox[", "(builtin)"), ("\\parindent", "(builtin)"), ("\\parsep", "(builtin)"), ("\\parskip", "(builtin)"), ("\\part", "(builtin)"), ("\\part*", "(builtin)"), ("\\part[", "(builtin)"), ("\\partial", "(builtin)"), ("\\partopsep", "(builtin)"), ("\\perp", "(builtin)"), ("\\phi", "(builtin)"), ("\\pi", "(builtin)"), ("\\pitchfork", "(builtin)"), ("\\plainoutput", "(builtin)"), ("\\pm", "(builtin)"), ("\\pmb", "(builtin)"), ("\\pmod", "(builtin)"), ("\\poptabs", "(builtin)"), ("\\pounds", "(builtin)"), ("\\prec", "(builtin)"), ("\\precapprox", "(builtin)"), ("\\preccurlyeq", "(builtin)"), ("\\preceq", "(builtin)"), ("\\precnapprox", "(builtin)"), ("\\precnsim", "(builtin)"), ("\\precsim", "(builtin)"), ("\\prime", "(builtin)"), ("\\printindex", "(builtin)"), ("\\prod", "(builtin)"), ("\\propto", "(builtin)"), ("\\protect", "(builtin)"), ("\\providecommand", "(builtin)"), ("\\psi", "(builtin)"), ("\\pushtabs", "(builtin)"), ("\\put(", "(builtin)"), ("\\qbezier(", "(builtin)"), ("\\qbezier[", "(builtin)"), ("\\qbeziermax", "(builtin)"), ("\\raggedleft", "(builtin)"), ("\\raggedright", "(builtin)"), ("\\raisebox", "(builtin)"), ("\\ref", "(builtin)"), ("\\refstepcounter", "(builtin)"), ("\\renewcommand", "(builtin)"), ("\\renewenvironment", "(builtin)"), ("\\resizebox", "(builtin)"), ("\\resizebox*", "(builtin)"), ("\\reversemarginpar", "(builtin)"), ("\\rho", "(builtin)"), ("\\right(", "(builtin)"), ("\\right)", "(builtin)"), ("\\right/", "(builtin)"), ("\\right[", "(builtin)"), ("\\right\\(", "(builtin)"), ("\\right\\)", "(builtin)"), ("\\right\\Downarrow", "(builtin)"), ("\\right\\Uparrow", "(builtin)"), ("\\right\\Updownarrow", "(builtin)"), ("\\right\\backslash", "(builtin)"), ("\\right\\downarrow", "(builtin)"), ("\\right\\langle", "(builtin)"), ("\\right\\lceil", "(builtin)"), ("\\right\\lfloor", "(builtin)"), ("\\right\\rangle", "(builtin)"), ("\\right\\rceil", "(builtin)"), ("\\right\\rfloor", "(builtin)"), ("\\right\\uparrow", "(builtin)"), ("\\right\\updownarrow", "(builtin)"), ("\\right\\|", "(builtin)"), ("\\right]", "(builtin)"), ("\\rightarrow", "(builtin)"), ("\\rightarrowtail", "(builtin)"), ("\\rightharpoondown", "(builtin)"), ("\\rightharpoonup", "(builtin)"), ("\\rightleftarrows", "(builtin)"), ("\\rightleftharpoons", "(builtin)"), ("\\rightmargin", "(builtin)"), ("\\rightrightarrows", "(builtin)"), ("\\rightsquigarrow", "(builtin)"), ("\\rightthreetimes", "(builtin)"), ("\\right|", "(builtin)"), ("\\risingdotseq", "(builtin)"), ("\\rmfamily", "(builtin)"), ("\\rotatebox", "(builtin)"), ("\\rp,am", "(builtin)"), ("\\rtimes", "(builtin)"), ("\\rule", "(builtin)"), ("\\rule[", "(builtin)"), ("\\savebox", "(builtin)"), ("\\sbox", "(builtin)"), ("\\scalebox", "(builtin)"), ("\\scriptscriptstyle", "(builtin)"), ("\\scriptsize", "(builtin)"), ("\\scriptstyle", "(builtin)"), ("\\scshape", "(builtin)"), ("\\searrow", "(builtin)"), ("\\sec", "(builtin)"), ("\\section", "(builtin)"), ("\\section*", "(builtin)"), ("\\section[", "(builtin)"), ("\\setcounter", "(builtin)"), ("\\setlength", "(builtin)"), ("\\setminus", "(builtin)"), ("\\settabs", "(builtin)"), ("\\settodepth", "(builtin)"), ("\\settoheight", "(builtin)"), ("\\settowidth", "(builtin)"), ("\\sevenbf", "(builtin)"), ("\\seveni", "(builtin)"), ("\\sevensy", "(builtin)"), ("\\sffamily", "(builtin)"), ("\\sharp", "(builtin)"), ("\\shortmid", "(builtin)"), ("\\shortparallel", "(builtin)"), ("\\shortstack", "(builtin)"), ("\\shortstack[", "(builtin)"), ("\\sigma", "(builtin)"), ("\\sim", "(builtin)"), ("\\simeq", "(builtin)"), ("\\sin", "(builtin)"), ("\\sinh", "(builtin)"), ("\\sloppy", "(builtin)"), ("\\slshape", "(builtin)"), ("\\small", "(builtin)"), ("\\smallfrown", "(builtin)"), ("\\smallsetminus", "(builtin)"), ("\\smallskip", "(builtin)"), ("\\smallsmile", "(builtin)"), ("\\smile", "(builtin)"), ("\\spadesuit", "(builtin)"), ("\\sphericalangle", "(builtin)"), ("\\sqcap", "(builtin)"), ("\\sqcup", "(builtin)"), ("\\sqrt", "(builtin)"), ("\\sqsubset", "(builtin)"), ("\\sqsubseteq", "(builtin)"), ("\\sqsupset", "(builtin)"), ("\\sqsupseteq", "(builtin)"), ("\\square", "(builtin)"), ("\\stackrel", "(builtin)"), ("\\star", "(builtin)"), ("\\stepcounter", "(builtin)"), ("\\stretch", "(builtin)"), ("\\subparagraph", "(builtin)"), ("\\subparagraph*", "(builtin)"), ("\\subparagraph[", "(builtin)"), ("\\subsection", "(builtin)"), ("\\subsection*", "(builtin)"), ("\\subsection[", "(builtin)"), ("\\subset", "(builtin)"), ("\\subseteq", "(builtin)"), ("\\subseteqq", "(builtin)"), ("\\subsetneq", "(builtin)"), ("\\subsetneqq", "(builtin)"), ("\\subsubsection", "(builtin)"), ("\\subsubsection*", "(builtin)"), ("\\subsubsection[", "(builtin)"), ("\\succ", "(builtin)"), ("\\succapprox", "(builtin)"), ("\\succcurlyeq", "(builtin)"), ("\\succeq", "(builtin)"), ("\\succnapprox", "(builtin)"), ("\\succnsim", "(builtin)"), ("\\succsim", "(builtin)"), ("\\sum", "(builtin)"), ("\\suppressfloats", "(builtin)"), ("\\suppressfloats[", "(builtin)"), ("\\supset", "(builtin)"), ("\\supseteq", "(builtin)"), ("\\supseteqq", "(builtin)"), ("\\supsetneq", "(builtin)"), ("\\supsetneqq", "(builtin)"), ("\\surd", "(builtin)"), ("\\swarrow", "(builtin)"), ("\\symbol", "(builtin)"), ("\\t", "(builtin)"), ("\\tabalign", "(builtin)"), ("\\tabbingsep", "(builtin)"), ("\\tabcolsep", "(builtin)"), ("\\tableofcontents", "(builtin)"), ("\\tabs", "(builtin)"), ("\\tabsdone", "(builtin)"), ("\\tabset", "(builtin)"), ("\\tan", "(builtin)"), ("\\tanh", "(builtin)"), ("\\tau", "(builtin)"), ("\\teni", "(builtin)"), ("\\text", "(builtin)"), ("\\textbf", "(builtin)"), ("\\textcolor", "(builtin)"), ("\\textfloatsep", "(builtin)"), ("\\textfraction", "(builtin)"), ("\\textit", "(builtin)"), ("\\textmd", "(builtin)"), ("\\textnormal", "(builtin)"), ("\\textrm", "(builtin)"), ("\\textsc", "(builtin)"), ("\\textsf", "(builtin)"), ("\\textsl", "(builtin)"), ("\\textstyle", "(builtin)"), ("\\texttt", "(builtin)"), ("\\textup", "(builtin)"), ("\\textwidth", "(builtin)"), ("\\thanks", "(builtin)"), ("\\therefore", "(builtin)"), ("\\theta", "(builtin)"), ("\\thickapprox", "(builtin)"), ("\\thicklines", "(builtin)"), ("\\thicksim", "(builtin)"), ("\\thinlines", "(builtin)"), ("\\thispagestyle", "(builtin)"), ("\\tilde", "(builtin)"), ("\\times", "(builtin)"), ("\\tiny", "(builtin)"), ("\\title", "(builtin)"), ("\\today", "(builtin)"), ("\\top", "(builtin)"), ("\\topfraction", "(builtin)"), ("\\topins", "(builtin)"), ("\\topinsert", "(builtin)"), ("\\topsep", "(builtin)"), ("\\totalheight", "(builtin)"), ("\\triangle", "(builtin)"), ("\\triangledown", "(builtin)"), ("\\triangleleft", "(builtin)"), ("\\trianglelefteq", "(builtin)"), ("\\triangleq", "(builtin)"), ("\\triangleright", "(builtin)"), ("\\trianglerighteq", "(builtin)"), ("\\ttfamily", "(builtin)"), ("\\twocolumn", "(builtin)"), ("\\twocolumn[", "(builtin)"), ("\\twoheadleftarrow", "(builtin)"), ("\\twoheadrightarrow", "(builtin)"), ("\\typein", "(builtin)"), ("\\typein[", "(builtin)"), ("\\typeout", "(builtin)"), ("\\u", "(builtin)"), ("\\ulcorner", "(builtin)"), ("\\unboldmath", "(builtin)"), ("\\underline", "(builtin)"), ("\\uparrow", "(builtin)"), ("\\updownarrow", "(builtin)"), ("\\upharpoonleft", "(builtin)"), ("\\upharpoonright", "(builtin)"), ("\\uplus", "(builtin)"), ("\\upshape", "(builtin)"), ("\\upsilon", "(builtin)"), ("\\upuparrows", "(builtin)"), ("\\urcorner", "(builtin)"), ("\\usebox", "(builtin)"), ("\\usecounter", "(builtin)"), ("\\usepackage", "(builtin)"), ("\\usepackage[", "(builtin)"), ("\\v", "(builtin)"), ("\\vDash", "(builtin)"), ("\\value", "(builtin)"), ("\\varepsilon", "(builtin)"), ("\\varkappa", "(builtin)"), ("\\varnothing", "(builtin)"), ("\\varphi", "(builtin)"), ("\\varpi", "(builtin)"), ("\\varpropto", "(builtin)"), ("\\varrho", "(builtin)"), ("\\varsigma", "(builtin)"), ("\\varsubsetneq", "(builtin)"), ("\\varsubsetneqq", "(builtin)"), ("\\varsupsetneq", "(builtin)"), ("\\varsupsetneqq", "(builtin)"), ("\\vartheta", "(builtin)"), ("\\vartriangle", "(builtin)"), ("\\vartriangleleft", "(builtin)"), ("\\vartriangleright", "(builtin)"), ("\\vdash", "(builtin)"), ("\\vdots", "(builtin)"), ("\\vec", "(builtin)"), ("\\vector(", "(builtin)"), ("\\vee", "(builtin)"), ("\\veebar", "(builtin)"), ("\\verb", "(builtin)"), ("\\verb*", "(builtin)"), ("\\vfill", "(builtin)"), ("\\vfootnote", "(builtin)"), ("\\vline", "(builtin)"), ("\\vspace", "(builtin)"), ("\\vspace*", "(builtin)"), ("\\wedge", "(builtin)"), ("\\whiledo", "(builtin)"), ("\\widehat", "(builtin)"), ("\\widetilde", "(builtin)"), ("\\width", "(builtin)"), ("\\wp", "(builtin)"), ("\\wr", "(builtin)"), ("\\xi", "(builtin)"), ("\\zeta", "(builtin)"), ("\\{", "(builtin)"), ("\\|", "(builtin)"), ("\\}", "(builtin)"), ("\\~", "(builtin)"), # Additions I've run across: ("\\ar", "(builtin)"), ("\\frm", "(builtin)"), ("\\ge", "(builtin)"), ("\\hrulefill", "(builtin)"), ("\\noalign", "(builtin)"), ("\\pair", "(builtin)"), ("\\pdfpageheight", "(builtin)"), ("\\pdfpagewidth", "(builtin)"), ("\\time", "(builtin)"), ("\\txt", "(builtin)"), ); }