]> gitweb.fluxo.info Git - blog.git/commitdiff
Feat: MathJax setup
authorSilvio Rhatto <rhatto@riseup.net>
Thu, 4 Mar 2021 18:29:27 +0000 (15:29 -0300)
committerSilvio Rhatto <rhatto@riseup.net>
Thu, 4 Mar 2021 18:29:27 +0000 (15:29 -0300)
16 files changed:
.gitmodules [new file with mode: 0644]
assets/css/local.css [moved from local.css with 100% similarity]
ikiwiki.yaml
lib/IkiWiki/Plugin/mathjax.pm [new file with mode: 0755]
meta.md
research/computing/suckless/sites.md
research/economics/valor-social.md
templates/page.tmpl
vendor/MathJax [new submodule]
vendor/bootstrap/css/bootstrap-responsive.css [moved from bootstrap/css/bootstrap-responsive.css with 100% similarity]
vendor/bootstrap/css/bootstrap-responsive.min.css [moved from bootstrap/css/bootstrap-responsive.min.css with 100% similarity]
vendor/bootstrap/css/bootstrap.css [moved from bootstrap/css/bootstrap.css with 100% similarity]
vendor/bootstrap/css/bootstrap.min.css [moved from bootstrap/css/bootstrap.min.css with 100% similarity]
vendor/bootstrap/img/glyphicons-halflings-white.png [moved from bootstrap/img/glyphicons-halflings-white.png with 100% similarity]
vendor/bootstrap/img/glyphicons-halflings.png [moved from bootstrap/img/glyphicons-halflings.png with 100% similarity]
vendor/ikiwiki-plugin-mathjax [new submodule]

diff --git a/.gitmodules b/.gitmodules
new file mode 100644 (file)
index 0000000..46a8d54
--- /dev/null
@@ -0,0 +1,6 @@
+[submodule "vendor/ikiwiki-plugin-mathjax"]
+       path = vendor/ikiwiki-plugin-mathjax
+       url = https://github.com/bk/ikiwiki-plugin-mathjax
+[submodule "vendor/MathJax"]
+       path = vendor/MathJax
+       url = https://github.com/mathjax/MathJax.git
similarity index 100%
rename from local.css
rename to assets/css/local.css
index 4780ec4ecdd87495879bd1e28e2f3108b437890d..3467f1e857914f126119e24704e3feb6073e2f03 100644 (file)
@@ -1,10 +1,10 @@
 # IkiWiki::Setup::Yaml - YAML formatted setup file
 #
 # Setup file for ikiwiki.
-# 
+#
 # Passing this to ikiwiki --setup will make ikiwiki generate
 # wrappers and build the wiki.
-# 
+#
 # Remember to re-run ikiwiki --setup any time you edit this file.
 #
 # name of the wiki
@@ -44,6 +44,7 @@ add_plugins:
 - sidebar
 - teximg
 - favicon
+- mathjax
 # plugins to disable
 disable_plugins:
 - openid
@@ -90,7 +91,7 @@ umask: 2
 # group for wrappers to run in
 #wrappergroup: ikiwiki
 # extra library and plugin directory
-libdir: ''
+libdir: 'lib'
 # environment variables
 ENV: {}
 # time zone name
@@ -212,6 +213,7 @@ pingurl: []
 # mdwn plugin
 # enable multimarkdown features?
 #multimarkdown: 0
+multimarkdown: 1
 # disable use of markdown discount?
 #nodiscount: 0
 
diff --git a/lib/IkiWiki/Plugin/mathjax.pm b/lib/IkiWiki/Plugin/mathjax.pm
new file mode 100755 (executable)
index 0000000..99b74c3
--- /dev/null
@@ -0,0 +1,74 @@
+package IkiWiki::Plugin::mathjax;
+
+use warnings;
+use strict;
+use IkiWiki 3.00;
+use MIME::Base64;
+
+# Strategy:
+## - filter replaces normal TeX delimiters with imath and dmath directives
+##   (perhaps while considering a mathconf directive); also, it adds a script
+##   block if there is any math on the page relevant.
+## - preprocess handles the directives themselves.
+##
+## Later: config hooks for mathjax script tag and mathjax config block
+##
+
+sub import {
+    hook(type => "filter", id => "mathjax", call => \&filter);
+    hook(type => "format", id=>"mathjax", call=> \&format);
+}
+
+sub format {
+    my %params = @_;
+    my $content = $params{content};
+    return $content unless $content =~ /\!\!mathjaxbegin/; #]/{{
+    $content =~ s{\!\!mathjaxbegin-i!! (.*?)\s\!\!mathjaxend-i\!\!}{'\('.decode_base64($1).'\)'}ges; #{
+    $content =~ s{\!\!mathjaxbegin-d!! (.*?)\s\!\!mathjaxend-d\!\!}{'\['.decode_base64($1).'\]'}ges; #{
+    my $scripttag = _scripttag();
+    $content =~ s{(</body>)}{$scripttag\n$1}i; #}{
+    return $content;
+}
+
+sub filter (@) {
+    my %params=@_;
+    my $content = $params{content};
+    return $content unless $content =~ /\$[^\$]+\$|\\[\(\[][\s\S]+\\[\)\]]/;
+    # first, handle display math...
+    $content =~ s{(?<!\\)\\\[(.+?)(?<!\\)\\\]}{_escape_mathjax('d', $1)}ges; #};[}
+    $content =~ s{(?<!\\)\$\$(.+?)(?<!\\)\$\$}{_escape_mathjax('d', $1)}ges; #};[}
+    # then, the inline math -- note that it must stay on one line
+    $content =~ s{(?<!\\)\\\((.+?)(?<!\\)\\\)}{_escape_mathjax('i', $1)}ge; #};[}
+    # note that the 'parsing' of $..$ is extremely fragile
+    $content =~ s{(?<!\\)\$(.+?)(?<!\\)\$}{_escape_mathjax('i', $1)}ge; #};[}
+    return $content;
+}
+
+sub _escape_mathjax {
+    my ($mode, $formula) = @_;
+    my %modes = qw/i inline d display/;
+    my $directive = "!!mathjaxbegin-$mode!! ";
+    $formula =~ s/"/&quot;/g;
+    $formula =~ s/&/&amp;/g; #"/}[{
+    $formula =~ s/</&lt;/g;
+    $formula =~ s/>/&gt;/g; #{"
+    $directive .= encode_base64($formula, " ");
+    $directive .= "!!mathjaxend-$mode!!";
+    return $directive;
+}
+
+sub _scripttag {
+    my $config = 'TeX-AMS_HTML'; # another possibility: TeX-AMS-MML_HTMLorMML
+    return '<script type="text/x-mathjax-config">'
+      . 'MathJax.Hub.Config({ TeX: { equationNumbers: {autoNumber: "AMS"} } });'
+      . '</script>'
+      . '<script async="async" type="text/javascript" '
+      # Serving MathJax script locally
+      #. 'src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.9/MathJax.js?config='
+      #. 'src="/js/MathJax.js?config='
+      . 'src="/vendor/MathJax/es5/tex-chtml.js?config='
+      . $config
+      . '"></script>';
+}
+
+1;
diff --git a/meta.md b/meta.md
index cbd6bb13a69b5b78f6a2705e3c17fa9fe849e6d8..a11ed322629da3c6b82b5a9e83f09dacf846c76f 100644 (file)
--- a/meta.md
+++ b/meta.md
@@ -33,7 +33,7 @@ See [keys](/keys).
 
 ### Technology
 
-* This is a [statically-generated website](/static).
+* This is a [statically-generated website](/research/suckless/sites).
 * That tries to implement [IndieWebCamp principles](http://indiewebcamp.com/principles).
 <!--
 * Using the same tags from [Fluxo de Links](https://links.fluxo.info) so
index 67149d56ee9d9613f93ae31f0f3726a4f7d65881..5ca19d2ec53a8282ed07d34bed6df7fd15bad9dd 100644 (file)
@@ -56,6 +56,13 @@ You can create passwordless SSH keys and use [rrsync](http://www.guyrutenberg.co
 
 Now simply run `make web_deploy` with the above mentioned `Makefile` do sync your static site!
 
+## MathJax
+
+* [Setup Instructions for MathJax on Ikiwiki](https://www.math.cmu.edu/~gautam/sj/blog/20130930-ikiwiki/010-setup.html).
+* [GitHub - bk/ikiwiki-plugin-mathjax: MathJax plugin for IkiWiki](https://github.com/bk/ikiwiki-plugin-mathjax).
+* [GitHub - mathjax/MathJax: Beautiful and accessible math in all browsers](https://github.com/mathjax/MathJax).
+* [MathJax documentation](https://docs.mathjax.org).
+
 ## Ikiwiki references
 
 * [Ikiwiki](http://ikiwiki.info).
index f12280c76c7e1a98f8412605fa0bf85c5dbbf956..7a68f8876475de46cd50658296b2186034a54ebf 100644 (file)
@@ -118,10 +118,10 @@ perguntas, podemos recorrer a um mínimo de sistematização. Considerando
 um grupo social de _m_ pessoas, podemos definir a função *valor social*
 como sendo
 
-[[!teximg code="S = \displaystyle\sum_{p=1}^{m}\frac{\left(p\ n_p\right)^{v}}{mr}"]]
+$$S = \displaystyle\sum_{p=1}^{m}\frac{\left(p\ n_p\right)^{v}}{mr}$$
 
-onde [[!teximg code="n_p"]] é a quantidade de acordos existentes envolvendo _p_
-pessoas[4], cada acordo com viralidade[5] _v_ e _r < m_ é o número de
+onde $n_p$ é a quantidade de acordos existentes envolvendo $p$
+pessoas[4], cada acordo com viralidade[5] $v$ e $r < m$ é o número de
 pessoas que *poderiam* [6] ter efetuado acordos mas que ficaram de fora
 (isto é, não fizeram acordo nenhum). O valor social assim definido exibe
 uma série de propriedades interessantes sob o ponto de vista das
@@ -137,15 +137,15 @@ múltiplas partes possui maior ação coletiva (maior participação
 coletiva, maior coletividade) do que uma sociedade com acordos entre
 apenas poucas partes.
 
-Já a quantidade _m_ de pessoas do grupo e o total _r_ de pessoas que não
+Já a quantidade $m$ de pessoas do grupo e o total $r$ de pessoas que não
 participaram de nenhum tipo de acordo contribuem na diminuição do valor
-social: se poucas pessoas (em relação ao total _m_) fazem acordo, temos
-uma sociedade com pouca ajuda múltipla e, portanto, para que _S_ atinja
-valores significativos, é preciso que _m_ se torne quantitativamente
-menor em relação aos valores dos componentes [[!textimg code="\left(p\ n_p\right)^{v}"]].
-O mesmo vale para _r_: os componentes devem ser mais significativos do
+social: se poucas pessoas (em relação ao total $m$) fazem acordo, temos
+uma sociedade com pouca ajuda múltipla e, portanto, para que $S$ atinja
+valores significativos, é preciso que $m$ se torne quantitativamente
+menor em relação aos valores dos componentes $\left(p\ n_p\right)^{v}$.
+O mesmo vale para $r$: os componentes devem ser mais significativos do
 que a quantidade de pessoas que poderiam estar em acordos mas que
-ficaram de fora, ou seja, _S_ leva em conta a inclusão ou exclusão
+ficaram de fora, ou seja, $S$ leva em conta a inclusão ou exclusão
 social da ação coletiva[7].
 
 Por fim, a viralidade potencializa a multiplicação de acordos: quanto
@@ -165,25 +165,25 @@ sistemas dinâmicos.
 
 Por simplificação, podemos reescrever a equação anterior como
 
-[[!teximg code="S = k\displaystyle\sum_{p=1}^{m}\left(p\ n_p\right)^{v}"]]
+$$S = k\displaystyle\sum_{p=1}^{m}\left(p\ n_p\right)^{v}$$
 
-onde [[!teximg code="k = \frac{1}{mr}"]]. É claro que o valor de _k_
+onde $k = \frac{1}{mr}$. É claro que o valor de $k$
 pode mudar num dado grupo social – por exemplo: mais pessoas ingressando
 ou saindo do grupo ou então com um aumento ou diminuição de protagonistas
 de acordos – mas podemos considerá-lo como constante num dado momemto, ou seja,
-[[!teximg code="k = k(t)"]] e independente de outras variáveis.
+$k = k(t)$ e independente de outras variáveis.
 
 O que realmente nos interessa agora, no entanto, é que chega um momento
 em que o grupo social está com tantos acordos que, da forma como
-definimos na equação [eq:simples], _S_ começa a crescer absurdamente e
+definimos na equação [eq:simples], $S$ começa a crescer absurdamente e
 já não passa a representar o valor efetivo de um corpo social onde a
 ajuda múltipla se faz presente. Em outras palavras: chega um momento em
 que as pessoas já estão tão endividadas de acordos a cumprir que mais
 dívidas não afetarão consideravelmente no seu comportamento de ajuda
-múltipla. Para refrear o crescimento indiscriminado de _S_,
+múltipla. Para refrear o crescimento indiscriminado de $S$,
 redefiniremos nossa função como
 
-[[!teximg code="S = k\ ln\displaystyle\sum_{p=1}^{m}\left(p\ n_p\right)^{v}"]]
+$$S = k\ ln\displaystyle\sum_{p=1}^{m}\left(p\ n_p\right)^{v}$$
 
 onde _ln_ cumpre um amortecimento no crescimento da somatória, mostrando
 que o valor efetivo do grupo cresce logaritmicamente: temos um rápido
@@ -191,16 +191,16 @@ crescimento do valor conforme os acordos se iniciam e se multiplicam e,
 conforme o endividamento social cresce, a sociedade atinge patamares de
 valor altos demais para que um maior acréscimo se torne significativo.
 
-Temos que, pela própria definição, _S_ é uma função de estado, uma vez
+Temos que, pela própria definição, $S$ é uma função de estado, uma vez
 que, definido um grupo social e suas interações a partir das variáveis
-_n_, _m_, _v_, _r_, etc, temos que _S_ é um indicativo do estado do
+$n$, $m$, $v$, $r$, etc, temos que $S$ é um indicativo do estado do
 sistema – indicando, por exemplo, se ele possui mais ou menos acordos (e
 qual a potência e alcance dos acordos) do que outro grupo social
 igualmente caracterizado. Além disso, obedece a
 
-[[!teximg code="\frac{dS}{dt} \geq 0"]]
+$$\frac{dS}{dt} \geq 0$$
 
-Portanto, chamaremos nossa última definição de _S_ (equação [eq:valor])
+Portanto, chamaremos nossa última definição de $S$ (equação [eq:valor])
 como *entropia econômica do grupo social*. Tal entropia mede,
 inicialmente, *o grau de endividamento do corpo social.* O endividamento
 é então a única forma de acúmulo possível: uma vez que alguém ajuda
@@ -231,7 +231,7 @@ tem um aumento indesejável, aqui se torna o comportamento almejado.
 Sendo os acordos diretos, isto é, não mediados, temos ainda mais
 descontrole: é importantíssimo que tais acordos não sejam mediados por
 bancos de dados. Por banco de dados entendemos qualquer iniciativa de
-tentar *efetivamente* calcular _S_ para um dado grupo social (e não o
+tentar *efetivamente* calcular $S$ para um dado grupo social (e não o
 registro pessoal que cada indivíduo mantiver a respeitodos acordos que
 participou). A mera existência de um banco de dados centralizado capaz
 de calcular a cada instante o valor social tem os seguintes riscos:
@@ -254,7 +254,7 @@ de calcular a cada instante o valor social tem os seguintes riscos:
 
 É com esse sentido de oposição aos bancos de dados que estabelecemos o
 conceito de valor social: não nos interessa calcular efetivamente o
-valor de _S_ para um dado grupo social e muito menos caracterizar cada
+valor de $S$ para um dado grupo social e muito menos caracterizar cada
 grupo em função desses parâmetros, o que além de policialesco não
 representa o real valor social do grupo (afinal, nem discutimos as
 diferenças qualitativas de cada acordo). Queremos, ao contrário, mostrar
@@ -305,30 +305,30 @@ Referências
    ou apoio mútuo (mas que eventualmente possa ter o mesmo
    significado).
 
-2. É claro que o valores de _v_ podem ser estipulados em cada acordo.
+2. É claro que o valores de $v$ podem ser estipulados em cada acordo.
 
 3. Por *conservar valor* não queremos dizer que a moeda não sofre
    valorização e desvalorização, mas sim que a moeda “congela”
    trabalho.
 
-4. Começamos nossa somatória com _p = 1_ pois, apesar de ser um caso
+4. Começamos nossa somatória com $p = 1$ pois, apesar de ser um caso
    em princípio bizarro (uma pessoa fazendo acordo consigo mesmo), não
    deixa de ser uma possibilidade: posso, por exemplo, fazer um acordo
    comigo mesmo e, caso o cumpra, ajudarei mais pessoas, sendo caso
    clássico disso é a solidariedade de ex-viciados, por exemplo. Outro
-   argumento para manter _p = 1_ é a simplicidade.
+   argumento para manter $p = 1$ é a simplicidade.
 
 5. Poderíamos, é claro, supor um sistema onde cada acordo tivesse uma
-   viralidade _v_ própria, mas a complexidade do cálculo seria
+   viralidade $v$ própria, mas a complexidade do cálculo seria
    desnecessária para esta primeira exposição do assunto.
 
-6. Que fique claro: _r_ não inclui pessoas que não podem ajudar, mas
+6. Que fique claro: $r$ não inclui pessoas que não podem ajudar, mas
    apenas as que podem mas que ficaram de fora dos acordos.
 
-7. Alternativamente, poderíamos definir o divisor como _m^r_ ao invés
-   de _mr_, o que faria com que _S_ fosse muito mais sensível à
+7. Alternativamente, poderíamos definir o divisor como $m^r$ ao invés
+   de $mr$, o que faria com que $S$ fosse muito mais sensível à
    inclusão ou exclusão social. Optamos, no entanto, por uma abordagem
-   em que _m_ e _r_ contribuem com igual teor.
+   em que $m$ e $r$ contribuem com igual teor.
 
 8. Num sistema mais próximo da realidade teríamos trocentas outras
    variáveis.
index 424d92338d9c742a312bd2c9886f3b839b751ad9..9fc2611c5739e6630302c414c1a0d67854ea0290 100644 (file)
 <TMPL_IF FAVICON>
 <link rel="icon" href="<TMPL_VAR BASEURL><TMPL_VAR FAVICON>" type="image/x-icon" />
 </TMPL_IF>
-<link rel="stylesheet" href="<TMPL_VAR BASEURL>bootstrap/css/bootstrap.min.css" type="text/css" />
-<link rel="stylesheet" href="<TMPL_VAR BASEURL>bootstrap/css/bootstrap-responsive.min.css" />
+<link rel="stylesheet" href="<TMPL_VAR BASEURL>vendor/bootstrap/css/bootstrap.min.css" type="text/css" />
+<link rel="stylesheet" href="<TMPL_VAR BASEURL>vendor/bootstrap/css/bootstrap-responsive.min.css" />
 <TMPL_IF LOCAL_CSS>
 <link rel="stylesheet" href="<TMPL_VAR BASEURL><TMPL_VAR LOCAL_CSS>" type="text/css" />
 <TMPL_ELSE>
-<link rel="stylesheet" href="<TMPL_VAR BASEURL>local.css" type="text/css" />
+<link rel="stylesheet" href="<TMPL_VAR BASEURL>assets/css/local.css" type="text/css" />
 </TMPL_IF>
 <TMPL_IF EDITURL>
 <link rel="alternate" type="application/x-wiki" title="Edit this page" href="<TMPL_VAR EDITURL>" />
diff --git a/vendor/MathJax b/vendor/MathJax
new file mode 160000 (submodule)
index 0000000..1335230
--- /dev/null
@@ -0,0 +1 @@
+Subproject commit 1335230503dddfeb0e07687308a55795d9c005e8
diff --git a/vendor/ikiwiki-plugin-mathjax b/vendor/ikiwiki-plugin-mathjax
new file mode 160000 (submodule)
index 0000000..25435b6
--- /dev/null
@@ -0,0 +1 @@
+Subproject commit 25435b6a1462626a2f713b78b2a348377b9ecafa