Добавить верхний индекс и нижний индекс точно на одной оси X в SVG - PullRequest
0 голосов
/ 11 июля 2019

Я хочу разместить надстрочный и подстрочный индекс в одном месте для текста, в SVG.Это требование в математических и химических уравнениях.Кажется, в SVg нет возможности для такого требования.

Требование состоит в том, что когда верхний индекс и нижний индекс располагаются рядом с каким-либо текстом, их значение происхождения x должно быть идентичным.Эти супер и подписки могут появляться до или после текста, и требование применяется к обоим случаям.Сначала я попытался разместить их, используя элемент SVG с координатами x & y, и он работает очень хорошо (приложение 1).Однако проблема возникает при программном поиске координат x & y для каждого элемента.

Затем я попытался использовать элемент с применением dx, что также хорошо работает, но dx зависит от размера шрифта.Прежде чем пытаться реализовать собственное решение, я хотел бы знать, есть ли лучшее решение.

Я приложил код, который использовал, и примеры изображений.

Моя первая попытка.

<?xml version="1.0" encoding="UTF-8"?> <!-- Code that works well with x & y coordinates for all elements --> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="0 0 64 64" style="stroke-width:0;fill:black;font-size:24px;font-family:Sans-serif"> <text x="17" y="50" font-size="48px">B</text> <text x="4" y="22">A</text> <text x="43.59" y="22" font-size="36px">±</text> <text x="4" y="63">Z</text> <text x="43.59" y="63">C</text> </svg>

Вторая попытка с рекомендуемыми элементами SVG <?xml version="1.0" encoding="UTF-8"?> <!-- Textbook recommended for super and subscripts, unacceptable result --> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="0 0 128 128" style="stroke-width:0;fill:black;font-size:24px;font-family:Sans-serif"> <text x="1" y="64" font-size="24px" letter-spacing="-4"> <tspan baseline-shift="super" font-size="18px" >A</tspan> <tspan baseline-shift="sub" font-size="18px" text-anchor="end">Z</tspan> B <tspan baseline-shift="super" font-size="18px" >±</tspan> <tspan baseline-shift="sub" font-size="18px">C</tspan> </text> </svg> Третья попытка с отрицательным dx для элементов tspan.

<?xml version="1.0" encoding="UTF-8"?> <!-- Code that works well with minus values for dx of subscripts --> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="0 0 128 128" style="stroke-width:0;fill:black;font-size:24px;font-family:Sans-serif"> <text x="1" y="64" font-size="24px" letter-spacing="-4"> <tspan baseline-shift="super" font-size="18px" >A</tspan> <tspan baseline-shift="sub" dx="-10" font-size="18px" text-anchor="end">Z</tspan> B <tspan baseline-shift="super" font-size="18px" >±</tspan> <tspan baseline-shift="sub" dx="-10" font-size="18px">C</tspan> </text> </svg>

Нет сообщений об ошибках.Ожидаемые и фактические результаты показаны на прилагаемых изображениях.1. Результат с координатами x & y для всех элементов SVG

Result with x & y coordinates for all SVG elements

2. Результат с рекомендуемыми элементами text & tspan и значениями смещения базовой линии super и sub

Result with the recommended text & tspan elements and baseline-shift values of super and sub

3. Результат с текстом и значениями tspan и минус dx для подписокimage& and minus dx values for subscripts">

1 Ответ

1 голос
/ 12 июля 2019

Если вы продолжите работу с SVG, то вам может пригодиться одно предложение: использовать em единиц для смещения ваших подстрочных и надстрочных координат. Таким образом, они не будут зависеть от размера шрифта, установленного для основного символа.

См. Следующий пример, где единственное различие между двумя SVG - это font-size настройка CSS.

#one {
  width: 250px;
  font-family: sans-serif;
  font-size: 48px;
}


#two {
  width: 250px;
  font-family: sans-serif;
  font-size: 32px;
}
<svg id="one" viewBox="0 0 64 64">
    <text x="17" y="50">B</text>
    <text x="17" y="50" font-size="0.5em" dx="-0.55em" dy="-1.2em">A</text>
    <text x="17" y="50" font-size="0.75em" dx="0.74em" dy="-0.78em">±</text>
    <text x="17" y="50" font-size="0.5em" dx="-0.55em" dy="0.55em">Z</text>
    <text x="17" y="50" font-size="0.5em" dx="1.1em" dy="0.55em">C</text>
</svg>


<svg id="two" viewBox="0 0 64 64">
    <text x="17" y="50">B</text>
    <text x="17" y="50" font-size="0.5em" dx="-0.55em" dy="-1.2em">A</text>
    <text x="17" y="50" font-size="0.75em" dx="0.74em" dy="-0.78em">±</text>
    <text x="17" y="50" font-size="0.5em" dx="-0.55em" dy="0.55em">Z</text>
    <text x="17" y="50" font-size="0.5em" dx="1.1em" dy="0.55em">C</text>
</svg>
...