|
<template> |
|
<svg |
|
class="formula-content" |
|
overflow="visible" |
|
:width="box.w + 32" |
|
:height="box.h + 32" |
|
stroke="#000" |
|
stroke-width="1" |
|
fill="none" |
|
stroke-linecap="round" |
|
stroke-linejoin="round" |
|
> |
|
<g |
|
:transform="`scale(${scale}, ${scale}) translate(0,0) matrix(1,0,0,1,0,0)`" |
|
transform-origin="0 50%" |
|
> |
|
<path :d="pathd"></path> |
|
</g> |
|
</svg> |
|
</template> |
|
|
|
<script lang="ts" setup> |
|
import { computed, ref, watch } from 'vue' |
|
import { hfmath } from './hfmath' |
|
|
|
const props = defineProps<{ |
|
latex: string |
|
width: number |
|
height: number |
|
}>() |
|
|
|
const box = ref({ x: 0, y: 0, w: 0, h: 0 }) |
|
const pathd = ref('') |
|
|
|
watch(() => props.latex, () => { |
|
const eq = new hfmath(props.latex) |
|
pathd.value = eq.pathd({}) |
|
box.value = eq.box({}) |
|
}, { immediate: true }) |
|
|
|
const scale = computed(() => { |
|
const boxW = box.value.w + 32 |
|
const boxH = box.value.h + 32 |
|
|
|
if (boxW > props.width || boxH > props.height) { |
|
if (boxW / boxH > props.width / props.height) return props.width / boxW |
|
return props.height / boxH |
|
} |
|
return 1 |
|
}) |
|
</script> |
|
|
|
<style lang="scss" scoped> |
|
svg { |
|
overflow: hidden; |
|
} |
|
</style> |