Skip to content

yex.box.WordBox

yex.box.WordBox(font) #

Bases: yex.box.hvbox.HBox

A box holding a sequence of characters, all in the same font.

Not something in TeΧ. This exists because the TeΧbook says about character tokens in horizontal mode (p282):

"If two or more commands of this type occur in succession, TeΧ processes them all as a unit, converting to ligatures and/or inserting kerns as directed by the font information."

Attributes: font: the font these characters are in. source_index (Union[int,None]): when this WordBox has gone through word-wrapping, this is the index of the same WordBox in the list which was wrapped. In all other cases, this is None.

    The actual numbers are unreliable, because lists change often.
    The only guarantee is that all the source_indexes will be
    unique and ascending, immediately after wrapping.
Source code in yex/box/wordbox.py
33
34
35
36
37
38
def __init__(self,
             font: 'yex.font.Font',
             ):
    super().__init__()
    self.font = font
    self.source_index = None

append(ch) #

Adds a single character to the WordBox.

Parameters:

Name Type Description Default
ch str

the character to add

required
Source code in yex/box/wordbox.py
 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
def append(self, ch:str) -> None:
    """
    Adds a single character to the WordBox.

    Args:
        ch: the character to add
    """
    if not isinstance(ch, str):
        raise TypeError(
                f'WordBoxes can only hold characters '
                f'(and not {ch}, which is {type(ch)})')
    elif len(ch)!=1:
        raise TypeError(
                f'You can only add one character at a time to '
                f'a WordBox (and not "{ch}")')

    new_char = hvbox.CharBox(
            ch = ch,
            font = self.font,
            )

    font_metrics = self.font.metrics

    previous = None
    try:
        previous = self.contents[-1].ch
    except IndexError as e:
        pass
    except AttributeError as e:
        pass

    if previous is not None:
        pair = previous + ch

        kern_size = font_metrics.kerns.get(pair, None)

        if kern_size is not None:
            new_kern = Kern(width=kern_size)
            logger.debug("%s: adding kern: %s",
                    self, new_kern)

            self.contents.append(new_kern)
            self._adjust_dimens_for_item(new_kern)
            logger.debug("%s: added kern: %s", self, new_kern)

        else:

            ligature = font_metrics.ligatures.get(pair, None)

            if ligature is not None:

                left_hand = self.contents.pop()

                new_char = hvbox.CharBox(
                        ch = ligature,
                        font = self.font,
                        )

                new_char.from_ligature = (
                    left_hand.from_ligature or previous) + ch

                self.width -= left_hand.width
                self.height = max([n.height-n.shifted_by
                    for n in self.contents],
                    default=yex.value.Dimen())
                self.depth = max([n.depth+n.shifted_by
                    for n in self.contents],
                    default=yex.value.Dimen())

                logger.debug(
                    "%s: adding ligature: briefly w=%s, h=%s, d=%s",
                    self,
                    self.width, self.height, self.depth,
                    )

    self.contents.append(new_char)
    self._adjust_dimens_for_item(new_char)
    self._ch_cache = None
    logger.debug("%s: adding %s after %s: now w=%s, h=%s, d=%s",
            self, str(new_char), str(previous),
            self.width, self.height, self.depth,
            )

showbox() #

Returns a list of lines to be displayed by \showbox.

WordBox doesn't appear in the output because it's not something that TeΧ displays.

Source code in yex/box/wordbox.py
133
134
135
136
137
138
139
140
141
142
def showbox(self) -> List[str]:
    r"""
    Returns a list of lines to be displayed by \showbox.

    WordBox doesn't appear in the output because it's not
    something that TeX displays.
    """
    return sum(
            [x.showbox() for x in self.contents],
            [])