mirror of
https://github.com/typst/typst
synced 2025-05-14 17:15:28 +08:00
parent
dca56a8028
commit
c4a1bd0055
@ -86,6 +86,25 @@ pub struct FigureElem {
|
|||||||
/// The figure's caption.
|
/// The figure's caption.
|
||||||
pub caption: Option<Content>,
|
pub caption: Option<Content>,
|
||||||
|
|
||||||
|
/// The caption's position.
|
||||||
|
///
|
||||||
|
/// You can set the caption position to `{top}` or `{bottom}`, defaults to
|
||||||
|
/// `{bottom}`.
|
||||||
|
///
|
||||||
|
/// ```example
|
||||||
|
/// #figure(
|
||||||
|
/// table(columns: 2)[A][B],
|
||||||
|
// caption: [I'm up here],
|
||||||
|
/// )
|
||||||
|
/// #figure(
|
||||||
|
/// table(columns: 2)[A][B],
|
||||||
|
/// caption: [I'm down here],
|
||||||
|
/// caption-pos: bottom,
|
||||||
|
/// )
|
||||||
|
/// ```
|
||||||
|
#[default(VerticalAlign(GenAlign::Specific(Align::Bottom)))]
|
||||||
|
pub caption_pos: VerticalAlign,
|
||||||
|
|
||||||
/// The kind of the figure this is.
|
/// The kind of the figure this is.
|
||||||
///
|
///
|
||||||
/// If set to `{auto}`, the figure will try to automatically determine its
|
/// If set to `{auto}`, the figure will try to automatically determine its
|
||||||
@ -174,6 +193,13 @@ impl Synthesize for FigureElem {
|
|||||||
.unwrap_or_else(|| FigureKind::Elem(ImageElem::func()))
|
.unwrap_or_else(|| FigureKind::Elem(ImageElem::func()))
|
||||||
});
|
});
|
||||||
|
|
||||||
|
let caption_pos =
|
||||||
|
VerticalAlign(GenAlign::Specific(match self.caption_pos(styles) {
|
||||||
|
VerticalAlign(GenAlign::Specific(Align::Top)) => Align::Top,
|
||||||
|
VerticalAlign(GenAlign::Specific(Align::Bottom)) => Align::Bottom,
|
||||||
|
_ => bail!(self.span(), "caption-position can only be top or bottom"),
|
||||||
|
}));
|
||||||
|
|
||||||
// Resolve the supplement.
|
// Resolve the supplement.
|
||||||
let supplement = match self.supplement(styles) {
|
let supplement = match self.supplement(styles) {
|
||||||
Smart::Auto => {
|
Smart::Auto => {
|
||||||
@ -221,6 +247,7 @@ impl Synthesize for FigureElem {
|
|||||||
}),
|
}),
|
||||||
)));
|
)));
|
||||||
|
|
||||||
|
self.push_caption_pos(caption_pos);
|
||||||
self.push_caption(self.caption(styles));
|
self.push_caption(self.caption(styles));
|
||||||
self.push_kind(Smart::Custom(kind));
|
self.push_kind(Smart::Custom(kind));
|
||||||
self.push_supplement(Smart::Custom(Some(Supplement::Content(supplement))));
|
self.push_supplement(Smart::Custom(Some(Supplement::Content(supplement))));
|
||||||
@ -239,9 +266,16 @@ impl Show for FigureElem {
|
|||||||
|
|
||||||
// Build the caption, if any.
|
// Build the caption, if any.
|
||||||
if let Some(caption) = self.full_caption(vt)? {
|
if let Some(caption) = self.full_caption(vt)? {
|
||||||
realized += VElem::weak(self.gap(styles).into()).pack();
|
let v = VElem::weak(self.gap(styles).into()).pack();
|
||||||
realized += caption;
|
realized = if matches!(
|
||||||
}
|
self.caption_pos(styles),
|
||||||
|
VerticalAlign(GenAlign::Specific(Align::Bottom))
|
||||||
|
) {
|
||||||
|
realized + v + caption
|
||||||
|
} else {
|
||||||
|
caption + v + realized
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Wrap the contents in a block.
|
// Wrap the contents in a block.
|
||||||
Ok(BlockElem::new()
|
Ok(BlockElem::new()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user