# 옵시디언 퍼블리시와 아스키매스의 사용
타협점은 am 코드 블록을 쓰는 것이다.
```am
a = b + c
f @ f = f
lim_(n->oo) a_n = b
```
행렬의 경우에는 변환이 필요했다.
```am
A = [1, 2; 3, 4], I = [1, 0; 0, 1], B = [a_1, a_2; a_3, a_4]
```
아래는 사용한 publish.js 의 대략적인 로직이다.
```js
MathJax = {
loader: {load: ['input/asciimath', 'output/chtml']}
}
const script = document.createElement('script');
script.onload = function () {
myInitCode();
};
script.src = 'https://cdn.jsdelivr.net/npm/mathjax@3/es5/startup.js?ts=' + new Date().getTime();
document.head.appendChild(script);
function myInitCode() {
Array.prototype.slice.call(document.getElementsByTagName('pre'))
.forEach(pre => {
const codes = pre.children[0].innerHTML.split('\n').filter(e => e);
const para = codes.reduce((acc, code) => acc + '`' +
extractAndReplaceWithFunction(code, parseMatrixString)
+ '`' + '<br/>', '');
pre.outerHTML = '<p style="text-align:center">' + para + '</p>';
});
}
function extractAndReplaceWithFunction(str, parseFunction) {
const regex = /\[([^\]]+)\]/g;
let result = str;
let match;
while ((match = regex.exec(str)) !== null) {
let content = match[1].trim();
let parsedContent = parseFunction(content);
result = result.replace(match[0], JSON.stringify(parsedContent));
}
return result;
}
function parseMatrixString(str) {
str = str.trim();
if (str.startsWith('[') && str.endsWith(']')) {
str = str.slice(1, -1);
}
let rows = str.split(';');
let result = [];
for (let row of rows) {
row = row.trim();
let elements = row.split(',');
elements = elements.map(el => Number(el.trim()));
result.push(elements);
}
return result;
}
```