mirror of
https://github.com/typst/typst
synced 2025-05-14 17:15:28 +08:00
Forced size command in math (#1128)
This commit is contained in:
parent
752817ae74
commit
5dbc15ef0c
@ -16,6 +16,16 @@
|
|||||||
These functions are distinct from the [`text`]($func/text) function because
|
These functions are distinct from the [`text`]($func/text) function because
|
||||||
math fonts contain multiple variants of each letter.
|
math fonts contain multiple variants of each letter.
|
||||||
|
|
||||||
|
- name: sizes
|
||||||
|
display: Sizes
|
||||||
|
functions: ["display", "inline", "script", "sscript"]
|
||||||
|
description: |
|
||||||
|
Forced size styles for expressions within formulas.
|
||||||
|
|
||||||
|
These functions allow manual configuration of the size of equation elements
|
||||||
|
to make them look as in a display/inline equation or as if used in a root or
|
||||||
|
sub/superscripts.
|
||||||
|
|
||||||
- name: underover
|
- name: underover
|
||||||
display: Under/Over
|
display: Under/Over
|
||||||
functions: [
|
functions: [
|
||||||
|
@ -100,6 +100,11 @@ pub fn module() -> Module {
|
|||||||
math.define("mono", mono);
|
math.define("mono", mono);
|
||||||
math.define("bb", bb);
|
math.define("bb", bb);
|
||||||
|
|
||||||
|
math.define("display", display);
|
||||||
|
math.define("inline", inline);
|
||||||
|
math.define("script", script);
|
||||||
|
math.define("sscript", sscript);
|
||||||
|
|
||||||
// Text operators.
|
// Text operators.
|
||||||
math.define("op", OpElem::func());
|
math.define("op", OpElem::func());
|
||||||
op::define(&mut math);
|
op::define(&mut math);
|
||||||
|
@ -178,6 +178,124 @@ pub fn bb(
|
|||||||
.into()
|
.into()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Forced display style in math.
|
||||||
|
///
|
||||||
|
/// This is the normal size for display equations.
|
||||||
|
///
|
||||||
|
/// ## Example { #example }
|
||||||
|
/// ```example
|
||||||
|
/// $sum_i x_i/2 = display(sum_i x/2)$
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// Display: Display Size
|
||||||
|
/// Category: math
|
||||||
|
/// Returns: content
|
||||||
|
#[func]
|
||||||
|
pub fn display(
|
||||||
|
/// The content to size.
|
||||||
|
body: Content,
|
||||||
|
/// Whether to impose a height restriction for exponents, like regular sub-
|
||||||
|
/// and superscripts do.
|
||||||
|
#[named]
|
||||||
|
#[default(false)]
|
||||||
|
cramp: bool,
|
||||||
|
) -> Value {
|
||||||
|
MathStyleElem::new(body)
|
||||||
|
.with_size(Some(MathSize::Display))
|
||||||
|
.with_cramp(Some(cramp))
|
||||||
|
.pack()
|
||||||
|
.into()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Forced inline (text) style in math.
|
||||||
|
///
|
||||||
|
/// This is the normal size for inline equations.
|
||||||
|
///
|
||||||
|
/// ## Example { #example }
|
||||||
|
/// ```example
|
||||||
|
/// $ sum_i x_i/2
|
||||||
|
/// = inline(sum_i x_i/2) $
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// Display: Inline Size
|
||||||
|
/// Category: math
|
||||||
|
/// Returns: content
|
||||||
|
#[func]
|
||||||
|
pub fn inline(
|
||||||
|
/// The content to size.
|
||||||
|
body: Content,
|
||||||
|
/// Whether to impose a height restriction for exponents, like regular sub-
|
||||||
|
/// and superscripts do.
|
||||||
|
#[named]
|
||||||
|
#[default(false)]
|
||||||
|
cramp: bool,
|
||||||
|
) -> Value {
|
||||||
|
MathStyleElem::new(body)
|
||||||
|
.with_size(Some(MathSize::Text))
|
||||||
|
.with_cramp(Some(cramp))
|
||||||
|
.pack()
|
||||||
|
.into()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Forced script style in math.
|
||||||
|
///
|
||||||
|
/// This is the smaller size used in powers or sub- or superscripts.
|
||||||
|
///
|
||||||
|
/// ## Example { #example }
|
||||||
|
/// ```example
|
||||||
|
/// $sum_i x_i/2 = script(sum_i x_i/2)$
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// Display: Script Size
|
||||||
|
/// Category: math
|
||||||
|
/// Returns: content
|
||||||
|
#[func]
|
||||||
|
pub fn script(
|
||||||
|
/// The content to size.
|
||||||
|
body: Content,
|
||||||
|
/// Whether to impose a height restriction for exponents, like regular sub-
|
||||||
|
/// and superscripts do.
|
||||||
|
#[named]
|
||||||
|
#[default(true)]
|
||||||
|
cramp: bool,
|
||||||
|
) -> Value {
|
||||||
|
MathStyleElem::new(body)
|
||||||
|
.with_size(Some(MathSize::Script))
|
||||||
|
.with_cramp(Some(cramp))
|
||||||
|
.pack()
|
||||||
|
.into()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Forced second script style in math.
|
||||||
|
///
|
||||||
|
/// This is the smallest size, used in second-level sub- and superscripts
|
||||||
|
/// (script of the script).
|
||||||
|
///
|
||||||
|
/// ## Example { #example }
|
||||||
|
/// ```example
|
||||||
|
/// $sum_i x_i/2 = sscript(sum_i x_i/2)$
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// Display: Script-Script Size
|
||||||
|
/// Category: math
|
||||||
|
/// Returns: content
|
||||||
|
#[func]
|
||||||
|
pub fn sscript(
|
||||||
|
/// The content to size.
|
||||||
|
body: Content,
|
||||||
|
/// Whether to impose a height restriction for exponents, like regular sub-
|
||||||
|
/// and superscripts do.
|
||||||
|
#[named]
|
||||||
|
#[default(true)]
|
||||||
|
cramp: bool,
|
||||||
|
) -> Value {
|
||||||
|
MathStyleElem::new(body)
|
||||||
|
.with_size(Some(MathSize::ScriptScript))
|
||||||
|
.with_cramp(Some(cramp))
|
||||||
|
.pack()
|
||||||
|
.into()
|
||||||
|
}
|
||||||
|
|
||||||
/// A font variant in math.
|
/// A font variant in math.
|
||||||
///
|
///
|
||||||
/// Display: Bold
|
/// Display: Bold
|
||||||
@ -196,6 +314,12 @@ pub struct MathStyleElem {
|
|||||||
|
|
||||||
/// Whether to use italic glyphs.
|
/// Whether to use italic glyphs.
|
||||||
pub italic: Option<bool>,
|
pub italic: Option<bool>,
|
||||||
|
|
||||||
|
/// Whether to use forced size
|
||||||
|
pub size: Option<MathSize>,
|
||||||
|
|
||||||
|
/// Whether to limit height of exponents
|
||||||
|
pub cramp: Option<bool>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LayoutMath for MathStyleElem {
|
impl LayoutMath for MathStyleElem {
|
||||||
@ -211,6 +335,12 @@ impl LayoutMath for MathStyleElem {
|
|||||||
if let Some(italic) = self.italic(StyleChain::default()) {
|
if let Some(italic) = self.italic(StyleChain::default()) {
|
||||||
style = style.with_italic(italic);
|
style = style.with_italic(italic);
|
||||||
}
|
}
|
||||||
|
if let Some(size) = self.size(StyleChain::default()) {
|
||||||
|
style = style.with_size(size);
|
||||||
|
}
|
||||||
|
if let Some(cramped) = self.cramp(StyleChain::default()) {
|
||||||
|
style = style.with_cramped(cramped);
|
||||||
|
}
|
||||||
ctx.style(style);
|
ctx.style(style);
|
||||||
self.body().layout_math(ctx)?;
|
self.body().layout_math(ctx)?;
|
||||||
ctx.unstyle();
|
ctx.unstyle();
|
||||||
@ -295,7 +425,7 @@ impl MathStyle {
|
|||||||
/// The size of elements in an equation.
|
/// The size of elements in an equation.
|
||||||
///
|
///
|
||||||
/// See the TeXbook p. 141.
|
/// See the TeXbook p. 141.
|
||||||
#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd)]
|
#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Cast)]
|
||||||
pub enum MathSize {
|
pub enum MathSize {
|
||||||
/// Second-level sub- and superscripts.
|
/// Second-level sub- and superscripts.
|
||||||
ScriptScript,
|
ScriptScript,
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 27 KiB |
@ -12,6 +12,12 @@ $A, italic(A), upright(A), bold(A), bold(upright(A)), \
|
|||||||
bb("hello") + bold(cal("world")), \
|
bb("hello") + bold(cal("world")), \
|
||||||
mono("SQRT")(x) wreath mono(123 + 456)$
|
mono("SQRT")(x) wreath mono(123 + 456)$
|
||||||
|
|
||||||
|
---
|
||||||
|
// Test forcing math size
|
||||||
|
$a/b, display(a/b), display(a)/display(b), inline(a/b), script(a/b), sscript(a/b) \
|
||||||
|
mono(script(a/b)), script(mono(a/b))\
|
||||||
|
script(a^b, cramp: #true), script(a^b, cramp: #false)$
|
||||||
|
|
||||||
---
|
---
|
||||||
// Test a few style exceptions.
|
// Test a few style exceptions.
|
||||||
$h, bb(N), cal(R), Theta, italic(Theta), sans(Theta), sans(italic(Theta))$
|
$h, bb(N), cal(R), Theta, italic(Theta), sans(Theta), sans(italic(Theta))$
|
||||||
|
Loading…
x
Reference in New Issue
Block a user