parameters: (source, opts, morecmds=[])
return_statement: return 0
docstring: Check the LaTeX formatting in a sequence of lines.
  
      Opts is a mapping of options to option values if any:
          -m          munge parenthesis and brackets
          -d          delimiters only checking
          -v          verbose trace of delimiter matching
          -s lineno:  linenumber to start scan (default is 1).
  
      Morecmds is a sequence of LaTeX commands (without backslashes) that
      are to be considered valid in the scan.
docstring_summary: Check the LaTeX formatting in a sequence of lines.
docstring_tokens: Check the LaTeX formatting in a sequence of lines .
function: def checkit(source, opts, morecmds=[]):
      """Check the LaTeX formatting in a sequence of lines.
  
      Opts is a mapping of options to option values if any:
          -m          munge parenthesis and brackets
          -d          delimiters only checking
          -v          verbose trace of delimiter matching
          -s lineno:  linenumber to start scan (default is 1).
  
      Morecmds is a sequence of LaTeX commands (without backslashes) that
      are to be considered valid in the scan.
      """
  
      texcmd = re.compile(r'\\[A-Za-z]+')
      falsetexcmd = re.compile(r'\/([A-Za-z]+)') # Mismarked with forward slash
  
      validcmds = set(cmdstr.split())
      for cmd in morecmds:
          validcmds.add('\\' + cmd)
  
      if '-m' in opts:
          pairmap = {']':'[(', ')':'(['}      # Munged openers
      else:
          pairmap = {']':'[', ')':'('}        # Normal opener for a given closer
      openpunct = set('([')                   # Set of valid openers
  
      delimiters = re.compile(r'\\(begin|end){([_a-zA-Z]+)}|([()\[\]])')
      braces = re.compile(r'({)|(})')
      doubledwords = re.compile(r'(\b[A-za-z]+\b) \b\1\b')
      spacingmarkup = re.compile(r'\\(ABC|ASCII|C|Cpp|EOF|infinity|NULL|plusminus|POSIX|UNIX)\s')
  
      openers = []                            # Stack of pending open delimiters
      bracestack = []                         # Stack of pending open braces
  
      tablestart = re.compile(r'\\begin{(?:long)?table([iv]+)}')
      tableline = re.compile(r'\\line([iv]+){')
      tableend = re.compile(r'\\end{(?:long)?table([iv]+)}')
      tablelevel = ''
      tablestartline = 0
  
      startline = int(opts.get('-s', '1'))
      lineno = 0
  
      for lineno, line in izip(count(startline), islice(source, startline-1, None)):
          line = line.rstrip()
  
          # Check balancing of open/close parenthesis, brackets, and begin/end blocks
          for begend, name, punct in delimiters.findall(line):
              if '-v' in opts:
                  print lineno, '|', begend, name, punct,
              if begend == 'begin' and '-d' not in opts:
                  openers.append((lineno, name))
              elif punct in openpunct:
                  openers.append((lineno, punct))
              elif begend == 'end' and '-d' not in opts:
                  matchclose(lineno, name, openers, pairmap)
              elif punct in pairmap:
                  matchclose(lineno, punct, openers, pairmap)
              if '-v' in opts:
                  print '   --> ', openers
  
          # Balance opening and closing braces
          for open, close in braces.findall(line):
              if open == '{':
                  bracestack.append(lineno)
              if close == '}':
                  try:
                      bracestack.pop()
                  except IndexError:
                      print r'Warning, unmatched } on line %s.' % (lineno,)
  
          # Optionally, skip LaTeX specific checks
          if '-d' in opts:
              continue
  
          # Warn whenever forward slashes encountered with a LaTeX command
          for cmd in falsetexcmd.findall(line):
              if '822' in line or '.html' in line:
                  continue    # Ignore false positives for urls and for /rfc822
              if '\\' + cmd in validcmds:
                  print 'Warning, forward slash used on line %d with cmd: /%s' % (lineno, cmd)
  
          # Check for markup requiring {} for correct spacing
          for cmd in spacingmarkup.findall(line):
              print r'Warning, \%s should be written as \%s{} on line %d' % (cmd, cmd, lineno)
  
          # Validate commands
          nc = line.find(r'\newcommand')
          if nc != -1:
              start = line.find('{', nc)
              end = line.find('}', start)
              validcmds.add(line[start+1:end])
          for cmd in texcmd.findall(line):
              if cmd not in validcmds:
                  print r'Warning, unknown tex cmd on line %d: \%s' % (lineno, cmd)
  
          # Check table levels (make sure lineii only inside tableii)
          m = tablestart.search(line)
          if m:
              tablelevel = m.group(1)
              tablestartline = lineno
          m = tableline.search(line)
          if m and m.group(1) != tablelevel:
              print r'Warning, \line%s on line %d does not match \table%s on line %d' % (m.group(1), lineno, tablelevel, tablestartline)
          if tableend.search(line):
              tablelevel = ''
  
          # Style guide warnings
          if 'e.g.' in line or 'i.e.' in line:
              print r'Style warning, avoid use of i.e or e.g. on line %d' % (lineno,)
  
          for dw in doubledwords.findall(line):
              print r'Doubled word warning.  "%s" on line %d' % (dw, lineno)
  
      lastline = lineno
      for lineno, symbol in openers:
          print "Unmatched open delimiter '%s' on line %d" % (symbol, lineno)
      for lineno in bracestack:
          print "Unmatched { on line %d" % (lineno,)
      print 'Done checking %d lines.' % (lastline,)
      return 0
function_tokens: def checkit ( source , opts , morecmds = [ ] ) : texcmd = re . compile ( r'\\[A-Za-z]+' ) falsetexcmd = re . compile ( r'\/([A-Za-z]+)' ) # Mismarked with forward slash validcmds = set ( cmdstr . split ( ) ) for cmd in morecmds : validcmds . add ( '\\' + cmd ) if '-m' in opts : pairmap = { ']' : '[(' , ')' : '([' } # Munged openers else : pairmap = { ']' : '[' , ')' : '(' } # Normal opener for a given closer openpunct = set ( '([' ) # Set of valid openers delimiters = re . compile ( r'\\(begin|end){([_a-zA-Z]+)}|([()\[\]])' ) braces = re . compile ( r'({)|(})' ) doubledwords = re . compile ( r'(\b[A-za-z]+\b) \b\1\b' ) spacingmarkup = re . compile ( r'\\(ABC|ASCII|C|Cpp|EOF|infinity|NULL|plusminus|POSIX|UNIX)\s' ) openers = [ ] # Stack of pending open delimiters bracestack = [ ] # Stack of pending open braces tablestart = re . compile ( r'\\begin{(?:long)?table([iv]+)}' ) tableline = re . compile ( r'\\line([iv]+){' ) tableend = re . compile ( r'\\end{(?:long)?table([iv]+)}' ) tablelevel = '' tablestartline = 0 startline = int ( opts . get ( '-s' , '1' ) ) lineno = 0 for lineno , line in izip ( count ( startline ) , islice ( source , startline - 1 , None ) ) : line = line . rstrip ( ) # Check balancing of open/close parenthesis, brackets, and begin/end blocks for begend , name , punct in delimiters . findall ( line ) : if '-v' in opts : print lineno , '|' , begend , name , punct , if begend == 'begin' and '-d' not in opts : openers . append ( ( lineno , name ) ) elif punct in openpunct : openers . append ( ( lineno , punct ) ) elif begend == 'end' and '-d' not in opts : matchclose ( lineno , name , openers , pairmap ) elif punct in pairmap : matchclose ( lineno , punct , openers , pairmap ) if '-v' in opts : print '   --> ' , openers # Balance opening and closing braces for open , close in braces . findall ( line ) : if open == '{' : bracestack . append ( lineno ) if close == '}' : try : bracestack . pop ( ) except IndexError : print r'Warning, unmatched } on line %s.' % ( lineno , ) # Optionally, skip LaTeX specific checks if '-d' in opts : continue # Warn whenever forward slashes encountered with a LaTeX command for cmd in falsetexcmd . findall ( line ) : if '822' in line or '.html' in line : continue # Ignore false positives for urls and for /rfc822 if '\\' + cmd in validcmds : print 'Warning, forward slash used on line %d with cmd: /%s' % ( lineno , cmd ) # Check for markup requiring {} for correct spacing for cmd in spacingmarkup . findall ( line ) : print r'Warning, \%s should be written as \%s{} on line %d' % ( cmd , cmd , lineno ) # Validate commands nc = line . find ( r'\newcommand' ) if nc != - 1 : start = line . find ( '{' , nc ) end = line . find ( '}' , start ) validcmds . add ( line [ start + 1 : end ] ) for cmd in texcmd . findall ( line ) : if cmd not in validcmds : print r'Warning, unknown tex cmd on line %d: \%s' % ( lineno , cmd ) # Check table levels (make sure lineii only inside tableii) m = tablestart . search ( line ) if m : tablelevel = m . group ( 1 ) tablestartline = lineno m = tableline . search ( line ) if m and m . group ( 1 ) != tablelevel : print r'Warning, \line%s on line %d does not match \table%s on line %d' % ( m . group ( 1 ) , lineno , tablelevel , tablestartline ) if tableend . search ( line ) : tablelevel = '' # Style guide warnings if 'e.g.' in line or 'i.e.' in line : print r'Style warning, avoid use of i.e or e.g. on line %d' % ( lineno , ) for dw in doubledwords . findall ( line ) : print r'Doubled word warning.  "%s" on line %d' % ( dw , lineno ) lastline = lineno for lineno , symbol in openers : print "Unmatched open delimiter '%s' on line %d" % ( symbol , lineno ) for lineno in bracestack : print "Unmatched { on line %d" % ( lineno , ) print 'Done checking %d lines.' % ( lastline , ) return 0