def testExercises(self): """ Exercises in the TeX book """ # 8.4 tokens = [x for x in TeX().input(r' $x^2$~ \TeX ^^C').itertokens()] expected = [MathShift('$'), Letter('x'), Superscript('^'), Other('2'), MathShift('$'), EscapeSequence('active::~'), Space(' '), EscapeSequence('TeX'), Other('\x03')] assert tokens == expected, '%s != %s' % (tokens, expected) # 8.5 tokens = [x for x in TeX().input('Hi!\n\n\n').itertokens()] expected = [Letter('H'), Letter('i'), Other('!'), Space(' '), EscapeSequence('par')] assert tokens == expected, '%s != %s' % (tokens, expected) # 8.6 tokens = [x for x in TeX().input(r'^^B^^BM^^A^^B^^C^^M^^@\M ').itertokens()] expected = [Other('\x02'), Other('\x02'), Letter('M'), Other('\x01'), Other('\x02'), Other('\x03'), Space(' '), EscapeSequence('M')] assert tokens == expected, '%s != %s' % (tokens, expected)
def testReadGlue2(self): s = TeX() s.input(r'6pt plus 2pt minus 2pt') i = s.readGlue() assert i.pt == 6, i.pt assert i.stretch.pt == 2, i.stretch.pt assert i.shrink.pt == 2, i.shrink.pt t = TeX() t.input(r'6pt plus 2pt minus 2pt 1.2pt plus -1.fil-1.234pt\foo') i = t.readGlue() j = t.readGlue() k = t.readGlue() # print i.source assert i.pt == 6, i.pt assert i.stretch.pt == 2, i.stretch.pt assert i.shrink.pt == 2, i.shrink.pt # print j.source assert j.pt == 1.2, i.pt assert j.stretch.fil == -1, j.stretch.fil assert j.shrink is None # print k.source assert k.pt == -1.234, k.pt assert k.stretch is None assert k.shrink is None tokens = [x for x in t.itertokens()] assert tokens == [EscapeSequence('foo')], tokens
def testSymbols(self): tokens = [x for x in TeX().input('\\ { } $ & # ^ _ ~ %').itertokens()] expected = [EscapeSequence(' '), BeginGroup('{'), Space(' '), EndGroup('}'), Space(' '), MathShift('$'), Space(' '), Alignment('&'), Space(' '), Parameter('#'), Space(' '), Superscript('^'), Space(' '), Subscript('_'), Space(' '), EscapeSequence('active::~'), Space(' ')] assert tokens == expected, '%s != %s' % (tokens, expected) tokens = [x for x in TeX().input(r'\\ \{ \} \$ \& \# \^ \_ \~ \%').itertokens()] expected = [EscapeSequence('\\'), Space(' '), EscapeSequence('{'), Space(' '), EscapeSequence('}'), Space(' '), EscapeSequence('$'), Space(' '), EscapeSequence('&'), Space(' '), EscapeSequence('#'), Space(' '), EscapeSequence('^'), Space(' '), EscapeSequence('_'), Space(' '), EscapeSequence('~'), Space(' '), EscapeSequence('%')] assert tokens == expected, '%s != %s' % (tokens, expected)
def testActive2(self): t = TeX() t.input( r'\catcode`|=\active\catcode`/=\active \def|#1{\textbf{#1}/} \def/{\textit{the end}} |{bold text}' ) output = t.parse() assert output[-2].nodeName == 'textbf', output[-2].nodeName assert output[-1].nodeName == 'textit', output[-1].nodeName
def testNumberSection(self): t = TeX() t.input(r''' \documentclass{article} \begin{document} \section{} \section{} \number\thesection \end{document} ''') assert t.parse().textContent.strip() == '2'
def testRomanNumeralSection(self): t = TeX() t.input(r''' \documentclass{article} \begin{document} \section{} \section{} \romannumeral\thesection \end{document} ''') assert t.parse().textContent.strip() == 'ii'
def testReadDimen2(self): # This is illegal # s = TeX() # s.input(r"'.77pt") # i = s.readDimen() # s = TeX() # s.input(r'"Ccc') # i = s.readDimen() s = TeX() s.input(r'-,sp') i = s.readDimen() assert i.sp == 0, i.sp
def squash_latex(inp, out, blobs_dir, options, helper=None): " transforms LaTeX file" if helper is None: helper = squash_helper_base() if not os.path.isabs(inp): inp = osjoin(blobs_dir, inp) thetex = TeX() thetex.input(open(inp), Tokenizer=TokenizerPassThru.TokenizerPassThru) if isinstance(out, str): if not os.path.isabs(out): out = osjoin(blobs_dir, out) out = open(out, 'w') itertokens = thetex.itertokens() squash_recurse(out, thetex, itertokens, options, helper) return helper
def testParagraph(self): tokens = [x for x in TeX().input('1\n 2\n \n 3\n').itertokens()] expected = [Other('1'), Space(' '), Other('2'), Space(' '), EscapeSequence('par'), Other('3'), Space(' ')] assert tokens == expected, '%s != %s' % (tokens, expected)
def testComment(self): tokens = [x for x in TeX().input('line % comment').itertokens()] expected = [Letter('l'), Letter('i'), Letter('n'), Letter('e'), Space(' ')] assert tokens == expected, '%s != %s' % (tokens, expected)
def reparse_metadata(inp, metadata, blobs_dir, options): " reparse metadata of LaTeX file" # from .transform import squash_helper_reparse_metadata helper = squash_helper_reparse_metadata(blobs_dir, metadata, options) from ColDoc.latex import environments_we_wont_latex if metadata.environ not in environments_we_wont_latex: helper.input_macros_with_parameters += options['split_graphic'] # if not os.path.isabs(inp): inp = osjoin(blobs_dir, inp) thetex = TeX() mydocument = thetex.ownerDocument mycontext = mydocument.context # # give it some context mycontext.loadPackage(thetex, 'article.cls', {}) #if args.split_sections: # mycontext.newcommand('section',1,r'\section{#1}') # mycontext.newcommand('subsection',1,r'\subsection{#1}') for name in options['metadata_command']: d = '\\' + name + '{#1}' #mycontext.newcommand(name, n, d) n = 1 newclass = type(name, (plasTeX.NewCommand, ), { 'nargs': n, 'opt': None, 'definition': d }) assert newclass.nargs == n mycontext.addGlobal(name, newclass) # thetex.input(open(inp), Tokenizer=TokenizerPassThru.TokenizerPassThru) out = io.StringIO() itertokens = thetex.itertokens() squash_recurse(out, thetex, itertokens, options, helper) # a = osjoin(os.path.dirname(inp), '.back_map.pickle') pickle.dump( helper.back_map, open(a, 'wb'), ) # return helper.back_map, helper.metadata
def testTokens(self): tokens = [x for x in TeX().input(r'{\hskip 36 pt}').itertokens()] expected = [BeginGroup('{'), EscapeSequence('hskip'), Other('3'), Other('6'), Space(' '), Letter('p'), Letter('t'), EndGroup('}')] assert tokens == expected, '%s != %s' % (tokens, expected)
def invoke(self, tex): if self.macroMode == Base.Environment.MODE_END: return for c in tex.iterchars(): if c is None or c == '' or c == ' ': continue else: tex.pushToken(c) if c != '[': tex.pushTokens([x for x in TeX.TeX().input('[]').itertokens()]) break s = ''.join(Base.verbatim.invoke(self, tex)[1:]).replace('\r', '').split('\n') _format(self, s)
def testUnitConversion(self): fuzz = 1e-3 s = TeX() s.input(r'1 pc') i = s.readDimen() assert i.pt - 12 < fuzz, i.pt s = TeX() s.input(r'1 in') i = s.readDimen() assert i.pt - 72.27 < fuzz, i.pt s = TeX() s.input(r'72 bp') i = s.readDimen() assert i.inch - 1 < fuzz, i.inch s = TeX() s.input(r'2.54 cm') i = s.readDimen() assert i.inch - 1 < fuzz, i.inch s = TeX() s.input(r'10 mm') i = s.readDimen() assert i.cm - 1 < fuzz, i.cm s = TeX() s.input(r'1157 dd') i = s.readDimen() assert i.pt - 1238 < fuzz, i.pt s = TeX() s.input(r'1 cc') i = s.readDimen() assert i.dd - 12 < fuzz, i.dd s = TeX() s.input(r'65536 sp') i = s.readDimen() assert i.pt - 1 < fuzz, i.pt
def testReadDecimal(self): s = TeX() s.input(r'-1.0') i = s.readDecimal() assert i == -1, 'expected -1, but got %s' % i s = TeX() s.input(r'-11234.0') i = s.readDecimal() assert i == -11234, 'expected -11234, but got %s' % i s = TeX() s.input(r'0.0') i = s.readDecimal() assert i == 0, 'expected 0, but got %s' % i
def testReadGlue(self): s = TeX() s.input(r'0pt plus 1fil') i = s.readGlue() assert i.pt == 0, i.pt assert i.stretch.fil == 1, i.stretch.fil assert i.shrink is None, i.shrink s = TeX() s.input(r'0pt plus 1fill') i = s.readGlue() assert i.pt == 0, i.pt assert i.stretch.fil == 1, i.stretch.fil assert i.shrink is None, i.shrink s = TeX() s.input(r'0pt plus 1fil minus 1 fil') i = s.readGlue() assert i.pt == 0, i.pt assert i.stretch.fil == 1, i.stretch.fil assert i.shrink.fil == 1, i.shrink.fil s = TeX() s.input(r'0pt plus -1fil') i = s.readGlue() assert i.pt == 0, i.pt assert i.stretch.fil == -1, i.stretch.fil assert i.shrink is None, i.shrink
def testActive2(self): t = TeX() t.input(r'\catcode`|=\active\catcode`/=\active \def|#1{\textbf{#1}/} \def/{\textit{the end}} |{bold text}') output = t.parse() assert output[-2].nodeName == 'textbf', output[-2].nodeName assert output[-1].nodeName == 'textit', output[-1].nodeName
def testReadDimen(self): fuzz = 1e-3 s = TeX() s.input(r'3 in') i = s.readDimen() assert i.inch - 3 < fuzz, i.inch s = TeX() s.input(r'29 pc') i = s.readDimen() assert i.pc - 29 < fuzz, i.pc s = TeX() s.input(r'-.013837in') i = s.readDimen() assert i.inch - -0.013837 < fuzz, i.inch s = TeX() s.input(r'+ 42,1 dd') i = s.readDimen() assert i.dd - 42.1 < fuzz, i.dd s = TeX() s.input(r'0.mm') i = s.readDimen() assert i.mm - 0 < fuzz, i.mm s = TeX() s.input(r'123456789sp') i = s.readDimen() assert i.sp - 123456789 < fuzz, i.sp
def testActiveSource(self): t = TeX() t.input(r'~') t = t.parse() assert t.source.strip() == '~', t.source.strip()
parser.add_argument('--add-UUID-comments', '--AUC', action='store_true', help="add comments to mark beg/end of blobs") #parser.add_argument('--add-UUID','--AU', # action='store_true', help="add \\uuid{UUID} commands") parser.add_argument( '--rm-uuid', action='store_true', help="remove the first line of a blob if it is `\\uuid{...}%` ") parser.add_argument('--verbose', '-v', action='count', default=0) # args = parser.parse_args() # verbose = args.verbose assert type(verbose) == int and verbose >= 0 if verbose > 1: logging.getLogger().setLevel(logging.DEBUG) elif verbose: logging.getLogger().setLevel(logging.INFO) else: logging.getLogger().setLevel(logging.WARNING) # mytex = TeX() # try: deblob_inator(args.root_uuid, mytex, args) except: logger.exception(__name__ + ' failed!') sys.exit(1)
def testParameters(self): tokens = [x for x in TeX().input(r'\def\foo#1[#2]{hi}').itertokens()]
def testActive(self): t = TeX() t.input(r'\catcode`|=\active \def|#1{\bf#1} |{bold text}') output = t.parse() assert output[-1].nodeName == 'bf', output[-1].nodeName
import sys, os from plasTeX import TeX, TeXDocument from plasTeX.Config import config as texConfig from plasTeX.Renderers.XHTML import Renderer FILE = sys.argv[1] tempdir = sys.argv[2] texConfig['files']['split-level'] = -10 texConfig['files']['filename'] = u'index$num(0).html' texConfig['general']['theme'] = 'minimal' cwd = os.getcwd() os.chdir(tempdir) document = TeXDocument(config=texConfig) tex = TeX.TeX(document, file=FILE) Renderer().render(tex.parse()) os.chdir(cwd)
def testGlueParameters(self): t = TeX() t.input(r'\newskip\foo\foo=\baselineskip') t.parse() foo = t.ownerDocument.context['foo'].value baselineskip = t.ownerDocument.context['baselineskip'].value assert foo == baselineskip, '"%s" != "%s"' % (foo, baselineskip) t = TeX() t.input(r'\newskip\foo\foo=7.6\baselineskip') t.parse() foo = t.ownerDocument.context['foo'].value baselineskip = t.ownerDocument.context['baselineskip'].value assert foo == (7.6*baselineskip), '"%s" != "%s"' % (foo, 7.6*baselineskip) t = TeX() t.input(r'\newskip\foo\foo=-4\baselineskip') t.parse() foo = t.ownerDocument.context['foo'].value baselineskip = t.ownerDocument.context['baselineskip'].value assert foo == (-4*baselineskip), '"%s" != "%s"' % (foo, (-4*baselineskip))
def testRomanNumeral(self): t = TeX() t.input(r'\romannumeral5') p = t.parse() assert ''.join(p) == 'v'
unicode(node)) if __name__ == "__main__": inputfile = sys.argv[1] latexcontent = open(inputfile, 'r').read() latexcontent = r'''\documentclass{book} \usepackage{latex2cnxmlmod} \usepackage{longtable} \begin{document} %s \end{document}''' % latexcontent tex = TeX.TeX() tex.ownerDocument.config['files']['split-level'] = -100 tex.ownerDocument.config['files']['filename'] = '%s.xml' % inputfile tex.input(latexcontent) document = tex.parse() # Render the document renderer = Renderer() renderer['chapter'] = renderer.section renderer['section'] = renderer.section renderer['subsection'] = renderer.section renderer['subsubsection'] = renderer.section renderer['par'] = renderer.par renderer['itemize'] = renderer.itemize renderer['keyconcepts'] = renderer.keyconcepts renderer['newwords'] = renderer.newwords
def testParameters(self): t = TeX() t.input(r'\newcount\foo\foo=\tolerance') t.parse() foo = t.ownerDocument.context['foo'].value tolerance = t.ownerDocument.context['tolerance'].value assert foo == tolerance, '"%s" != "%s"' % (foo, tolerance) t = TeX() t.input(r'\newcount\foo\foo=7\tolerance') t.parse() foo = t.ownerDocument.context['foo'].value tolerance = t.ownerDocument.context['tolerance'].value assert foo == (7 * tolerance), '"%s" != "%s"' % (foo, 7 * tolerance) t = TeX() t.input(r'\newcount\foo\foo=-3\tolerance') t.parse() foo = t.ownerDocument.context['foo'].value tolerance = t.ownerDocument.context['tolerance'].value assert foo == (-3 * tolerance), '"%s" != "%s"' % (foo, -3 * tolerance)
def testParameters(self): t = TeX() t.input(r'\newcount\foo\foo=\tolerance') t.parse() foo = t.ownerDocument.context['foo'].value tolerance = t.ownerDocument.context['tolerance'].value assert foo == tolerance, '"%s" != "%s"' % (foo, tolerance) t = TeX() t.input(r'\newcount\foo\foo=7\tolerance') t.parse() foo = t.ownerDocument.context['foo'].value tolerance = t.ownerDocument.context['tolerance'].value assert foo == (7*tolerance), '"%s" != "%s"' % (foo, 7*tolerance) t = TeX() t.input(r'\newcount\foo\foo=-3\tolerance') t.parse() foo = t.ownerDocument.context['foo'].value tolerance = t.ownerDocument.context['tolerance'].value assert foo == (-3*tolerance), '"%s" != "%s"' % (foo, -3*tolerance)
def testDoubleSuper(self): tokens = [x for x in TeX().input('^^I ^^A ^^@ ^^M').itertokens()] expected = [Other('\x01'), Space(' ')] assert tokens == expected, '%s != %s' % (tokens, expected)
def testGlueParameters(self): t = TeX() t.input(r'\newskip\foo\foo=\baselineskip') t.parse() foo = t.ownerDocument.context['foo'].value baselineskip = t.ownerDocument.context['baselineskip'].value assert foo == baselineskip, '"%s" != "%s"' % (foo, baselineskip) t = TeX() t.input(r'\newskip\foo\foo=7.6\baselineskip') t.parse() foo = t.ownerDocument.context['foo'].value baselineskip = t.ownerDocument.context['baselineskip'].value assert foo == ( 7.6 * baselineskip), '"%s" != "%s"' % (foo, 7.6 * baselineskip) t = TeX() t.input(r'\newskip\foo\foo=-4\baselineskip') t.parse() foo = t.ownerDocument.context['foo'].value baselineskip = t.ownerDocument.context['baselineskip'].value assert foo == (-4 * baselineskip), '"%s" != "%s"' % (foo, (-4 * baselineskip))
def testDimenParameters(self): t = TeX() t.input(r'\newdimen\foo\foo=\hsize') t.parse() foo = t.ownerDocument.context['foo'].value hsize = t.ownerDocument.context['hsize'].value assert foo == hsize, '"%s" != "%s"' % (foo, hsize) t = TeX() t.input(r'\newdimen\foo\foo=7.6\hsize') t.parse() foo = t.ownerDocument.context['foo'].value hsize = t.ownerDocument.context['hsize'].value assert foo == (7.6 * hsize), '"%s" != "%s"' % (foo, 7.6 * hsize) t = TeX() t.input(r'\newdimen\foo\foo=-4\hsize') t.parse() foo = t.ownerDocument.context['foo'].value hsize = t.ownerDocument.context['hsize'].value assert foo == (-4 * hsize), '"%s" != "%s"' % (foo, (-4 * hsize))
def testDimenParameters(self): t = TeX() t.input(r'\newdimen\foo\foo=\hsize') t.parse() foo = t.ownerDocument.context['foo'].value hsize = t.ownerDocument.context['hsize'].value assert foo == hsize, '"%s" != "%s"' % (foo, hsize) t = TeX() t.input(r'\newdimen\foo\foo=7.6\hsize') t.parse() foo = t.ownerDocument.context['foo'].value hsize = t.ownerDocument.context['hsize'].value assert foo == (7.6*hsize), '"%s" != "%s"' % (foo, 7.6*hsize) t = TeX() t.input(r'\newdimen\foo\foo=-4\hsize') t.parse() foo = t.ownerDocument.context['foo'].value hsize = t.ownerDocument.context['hsize'].value assert foo == (-4*hsize), '"%s" != "%s"' % (foo, (-4*hsize))