コード例 #1
0
    def invoke(self, tex):
        if self.macroMode == Macro.MODE_END:
            res = self.ownerDocument.createElement('end' + self.tagName).invoke(tex)
            if res is None:
                return [res, EndGroup(' ')]
            return res + [EndGroup(' ')]

        params = [None]

        # Get optional argument, if needed
        nargs = self.nargs
        if self.opt is not None:
            nargs -= 1
            params.append(tex.readArgument('[]', default=self.opt,
                                           parentNode=self,
                                           name='#%s' % len(params)))

        # Get mandatory arguments
        for i in range(nargs):
            params.append(tex.readArgument(parentNode=self,
                                           name='#%s' % len(params)))

        deflog.debug2('expanding %s %s', self.definition, params)

        output = []
        if self.macroMode == Macro.MODE_BEGIN:
            output.append(BeginGroup(' '))

        return output + expandDef(self.definition, params)
コード例 #2
0
def expandDef(definition, params):
    # Walk through the definition and expand parameters
    if not definition:
        return []
    output = []
    definition = iter(definition)
    previous = ''
    for t in definition:
        # Expand parameters
        if t.catcode == Token.CC_PARAMETER:
            for t in definition:
                # Double '#'
                if t.catcode == Token.CC_PARAMETER:
                    output.append(t)
                else:
                    if params[int(t)] is not None:
                        # This is a pretty bad hack, but `ifx' commands
                        # need an argument to also be a token.  So we
                        # wrap them in a group here and let the
                        # TeX parser convert the group to a token.
                        if previous == 'ifx':
                            output.append(BeginGroup(' '))
                            output.extend(params[int(t)])
                            output.append(EndGroup(' '))
                        else:
                            output.extend(params[int(t)])
                break
        # Just append other tokens to the output
        else:
            output.append(t)
        previous = t
    return output
コード例 #3
0
 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('}')
     ]
     self.assertEqual(tokens, expected)
コード例 #4
0
    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(' ')
        ]
        self.assertEqual(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('%')
        ]
        self.assertEqual(tokens, expected)