Source code for pyexlatex.figure.models.subfigure
import re
from typing import Tuple
from pyexlatex.figure.models.graphic import Graphic
from pyexlatex.models.item import Item
from pyexlatex.models.caption import Caption
from pyexlatex.models.label import Label
from pyexlatex.logic.builder import build_figure_content
from pyexlatex.models.containeritem import ContainerItem
POSITION_STR_PATTERN = re.compile(r'\[([tcb])\]{([\d.\w\\]+)}')
[docs]class Subfigure(ContainerItem, Item):
"""
Used for more control over building figures
"""
name = 'subfigure'
[docs] def __init__(self, filepath, caption=None, label=None, centering=True, position_str=r'[t]{0.45\linewidth}',
cache: bool = True):
self.graphic = Graphic(filepath, cache=cache)
self.caption = Caption(caption) if caption else None
self.label = Label(label) if label else None
self.position_str = position_str
self.anchor, self.width = anchor_and_width_from_position_str(self.position_str)
self.add_data_from_content(self.graphic)
contents = build_figure_content(
[self.graphic],
caption=self.caption,
label=self.label,
centering=centering,
position_str=position_str
)
super().__init__(self.name, contents)
def __repr__(self):
return f'<Subfigure({self.graphic.filepath}, caption={self.caption})>'
[docs]def anchor_and_width_from_position_str(position: str) -> Tuple[str, str]:
if not isinstance(position, str):
position = str(position)
match = re.match(POSITION_STR_PATTERN, position)
if not match:
raise ValueError(f'could not parse position {position}')
anchor = match.group(1)
width = match.group(2)
return anchor, width