VScode住人の探検記

Visual Studio Codeでなんでもこなすのがポリシー。LaTeX(2020/7/19~), C(2021/1/25~), C#(2/4~), HTML&CSS(2/14~), Python(2/16~), JavaScript(2/28~), jQuery(3/18~), Sass(Scss)(3/20~),シェルスクリプト(3/21~), jCanvas(5/21~), WordPress(5/23~), PHP(5/31~)

日本語の添え字をつける【LaTeXのnewcommand】

圧力を表す文字Pの左下に『アンモニア』を添えることで、アンモニアの圧力を一文字で表すことができる。

このように、文字に日本語の添え字を加えるというシチュエーションはまあまあよくあるのではないだろうか。

だが、このような日本語の添え字をつける操作はいろいろと面倒なのである。

たとえば、Pの左下に3を添えるには、 

$P_3$

と入力すればよい。_や^は数式環境でしか使うことができないため、$ $で囲ってある。

$ $の中は数式環境(数式やアルファベットしか使用できない環境)であるので、日本語の添え字をつけるためには、さらに日本語部分を\mbox{ }で囲ってあげなくてはならない。(\mbox{ }で囲った日本語は、数式環境内でも認識される。)

つまり、たとえばPの左下にアンモニアを添えるとしたら、

$P_{\mbox{アンモニア}}$

と記述すればよい。

…のだが、この出力結果を見てみると、

f:id:nix_campane:20200831010005p:plain

今度は添え字デカすぎ問題が浮上する。 

添え字の大きさを変更するには、プリアンブルに\usepackage{graphicx}を入力した上で、

$P_{\scalebox{0.5}{\mbox{アンモニア}}}$

とすればよい。

\scalebox{0.5}{ }で囲んであげることにより、アンモニアの部分が0.5倍に縮小されるのだ。(もちろん倍率は好きな値に変えてよい)

この出力を見てみると、

f:id:nix_campane:20200831010854p:plain

…うん、やっと添え字っぽくなった。

さて、以上の流れをいちいち行うのは大変面倒なので、

\soeniho{P}{アンモニア}

と入力するだけで上の画像のような出力が得られるコマンドを作成した。

ソースコードをどうぞ。添字の倍率(0.5の部分)はお好みで変えてね

\usepackage{graphicx}
\newcommand{\soeniho}[2]{$#1_{\scalebox{0.5}{\mbox{#2}}}$}

こんな感じで使っています↓↓↓

f:id:nix_campane:20200831022925j:plain

LaTeXで色付きニューマン投影式を描く【LaTeXのnewcommand】

\usepackage{chemmacros}と入力するとbegin{document}に対してundefined control sequenceエラーが出るという謎の現象が発生しており、2日間いろいろな策を試みたものの一向に解決の兆しが見えないため、いよいよ最終手段に出ることにした。

その最終手段とは…結局chemmacrosの使用は諦め、
『他のパッケージで代用できない機能は自分で作る』

というわけで、まずはchemmacros独自の機能であるニューマン投影式の描画コマンドの代わりとなるものを自作しよう。
chemmacrosのプログラムはexpl3とxparseによって記述されている。しかし、expl3はまったく分からない上、それ自体がエラーの原因になっている可能性も否定できないため、ここは無難にtikzとLaTeXのnewcommand機能を用いて作成することとする。

そして完成品がこちら。

  • ねじり型ニューマン投影式…\nejinewm
  • なり型ニューマン投影式…\kasanewm
  • 色分けバージョン…語尾にcl
\nejinewm{H}{CH}{F}{Cl}{N}{O}%下図の左から1番目を出力する
\nejinewmcl{H}{CH}{F}{Cl}{N}{O}%下図の左から2番目を出力する
\kasanewm{H}{CH}{F}{Cl}{N}{O}%下図の右から2番目を出力する
\kasanewmcl{H}{CH}{F}{Cl}{N}{O}%下図の右から1番目を出力する

…と入力すると、下図が簡単に描ける。{ }内は分かりやすいようにすべて違う原子団にしている。もちろん{ }内に好きな原子団を放り込めばよい。
f:id:nix_campane:20200829011832p:plain

ソースコードはこちら。
プリアンブルに記述するには長すぎるので、コピペして適当な名前のstyファイルとして保存し、usepackageで呼び出して使うのがオススメ。

%アルファベットや数式をちょっと可愛くするフォントパッケージ(お好みで。使わなくてもよし)
\usepackage[math]{anttor}
%必須
\usepackage{xcolor}
\usepackage{tikz}
\usetikzlibrary{calc,intersections}

%手前の炭素につく基の色の定義(RGB以降は好きな色に書き換えてもよし)
\definecolor{plmomo}{RGB}{248,22,147}
%後ろの炭素とその基の色(RGB以降は好きな色に書き換えてもよし)
\definecolor{plmizu}{RGB}{2,181,238}

%ねじり型ニューマン投影式描画コマンドnejinewm
\newcommand{\nejinewm}[6]{
\begin{tikzpicture}
  \coordinate (C) at (0,0) ;
  \foreach \angle in {90,210,330}
   {
     \draw (C) -- ++(\angle:1.5) coordinate (C-\angle) ;
   }
  \draw
    (C) circle (.75);
  \foreach \angle in {30,150,270}
    {
      \draw (C) ++(\angle:.75)--++(\angle:.75) coordinate (C-\angle) ;
    }
  \foreach \angle in {30}
    { \node[inner sep=0,anchor=180+\angle] at (C-\angle) {#1} ; }
  \foreach \angle in {90}
    { \node[inner sep=0,anchor=180+\angle] at (C-\angle) {#2} ; }
  \foreach \angle in {150}
    { \node[inner sep=0,anchor=180+\angle] at (C-\angle) {#3} ; }
  \foreach \angle in {210}
    { \node[inner sep=0,anchor=180+\angle] at (C-\angle) {#4} ; }
  \foreach \angle in {270}
    { \node[inner sep=0,anchor=180+\angle] at (C-\angle) {#5} ; }
  \foreach \angle in {330}
    { \node[inner sep=0,anchor=180+\angle] at (C-\angle) {#6} ; }
\end{tikzpicture}
}

%色付きのねじり型ニューマン投影式描画コマンドnejinewmcl
\newcommand{\nejinewmcl}[6]{
\begin{tikzpicture}
  \coordinate (C) at (0,0) ;/
  \foreach \angle in {90,210,330}
   {
     \draw[very thick,plmomo](C) -- ++(\angle:1.5) coordinate (C-\angle) ;
   }
  \draw[plmizu](C) circle (.75);
  \foreach \angle in {30,150,270}
    {
      \draw[very thick,plmizu](C) ++(\angle:.75)--++(\angle:.75) coordinate (C-\angle) ;
    }
  \foreach \angle in {30}
    { \node[very thick,plmizu,inner sep=0,anchor=180+\angle] at (C-\angle) {#1} ; }
  \foreach \angle in {90}
    { \node[very thick,plmomo,inner sep=0,anchor=180+\angle] at (C-\angle) {#2} ; }
  \foreach \angle in {150}
    { \node[very thick,plmizu,inner sep=0,anchor=180+\angle] at (C-\angle) {#3} ; }
  \foreach \angle in {210}
    { \node[very thick,plmomo,inner sep=0,anchor=180+\angle] at (C-\angle) {#4} ; }
  \foreach \angle in {270}
    { \node[very thick,plmizu,inner sep=0,anchor=180+\angle] at (C-\angle) {#5} ; }
  \foreach \angle in {330}
    { \node[very thick,plmomo,inner sep=0,anchor=180+\angle] at (C-\angle) {#6} ; }
\end{tikzpicture}
}

%重なり型ニューマン投影式描画コマンドkasanewm
\newcommand{\kasanewm}[6]{
\begin{tikzpicture}
  \coordinate (C) at (0,0) ;
  \foreach \angle in {90,210,330}
   {
     \draw (C) -- ++(\angle:1.5) coordinate (C-\angle) ;
   }
  \draw
    (C) circle (.75);
  \foreach \angle in {75,195,315}
    {
      \draw (C) ++(\angle:.75)--++(\angle:.75) coordinate (C-\angle) ;
    }
  \foreach \angle in {75}
    { \node[inner sep=0,anchor=180+\angle] at (C-\angle) {#1} ; }
  \foreach \angle in {90}
    { \node[inner sep=0,anchor=180+\angle] at (C-\angle) {#2} ; }
  \foreach \angle in {195}
    { \node[inner sep=0,anchor=180+\angle] at (C-\angle) {#3} ; }
  \foreach \angle in {210}
    { \node[inner sep=0,anchor=180+\angle] at (C-\angle) {#4} ; }
  \foreach \angle in {315}
    { \node[inner sep=0,anchor=180+\angle] at (C-\angle) {#5} ; }
  \foreach \angle in {330}
    { \node[inner sep=0,anchor=180+\angle] at (C-\angle) {#6} ; }
\end{tikzpicture}
}


%色付きの重なり型ニューマン投影式描画コマンドkasanewmcl
\newcommand{\kasanewmcl}[6]{
\begin{tikzpicture}
  \coordinate (C) at (0,0) ;/
  \foreach \angle in {90,210,330}
   {
     \draw[very thick,plmomo](C) -- ++(\angle:1.5) coordinate (C-\angle) ;
   }
  \draw[plmizu](C) circle (.75);
  \foreach \angle in {75,195,315}
    {
      \draw[very thick,plmizu](C) ++(\angle:.75)--++(\angle:.75) coordinate (C-\angle) ;
    }
  \foreach \angle in {75}
    { \node[very thick,plmizu,inner sep=0,anchor=180+\angle] at (C-\angle) {#1} ; }
  \foreach \angle in {90}
    { \node[very thick,plmomo,inner sep=0,anchor=180+\angle] at (C-\angle) {#2} ; }
  \foreach \angle in {195}
    { \node[very thick,plmizu,inner sep=0,anchor=180+\angle] at (C-\angle) {#3} ; }
  \foreach \angle in {210}
    { \node[very thick,plmomo,inner sep=0,anchor=180+\angle] at (C-\angle) {#4} ; }
  \foreach \angle in {315}
    { \node[very thick,plmizu,inner sep=0,anchor=180+\angle] at (C-\angle) {#5} ; }
  \foreach \angle in {330}
    { \node[very thick,plmomo,inner sep=0,anchor=180+\angle] at (C-\angle) {#6} ; }
\end{tikzpicture}
}

…白状しよう。
実はゼロから自分で作ったわけではない。(そもそもtikzの使用自体が今回が初体験なので何一つわからなかった)下記リンクにあるコードをベースにいろいろいじったのである。

Newman-Projektion mit chemmacros - TeXwelt

赤シートで隠れる暗記問題集を作る【LaTeXのnewcommand】

LaTeXを始めてちょうど1ヶ月、初めてオリジナルコマンドを創作した。(とはいえプログラミング知識ゼロ人間が作れるものなどたかが知れており、めちゃくちゃショボい)

その名も『\annki』、\annki{ }で囲めばその部分が赤シートで消える仕様になるというものである。

出力はこんな感じ
(少なくとも私が所有しているプリンターで印刷すると)黒字でない部分はすべて赤シートでほぼ消える。

f:id:nix_campane:20200825033112j:plain

この色味は何度も何度も試行錯誤した末にたどり着いたものだ。
自宅のプリンターは格安ゆえに曲者で、とにかく画質が粗い。そのせいで、カラー文字はいかにも『複数の色のインクを混ぜ合わせてつくりました』と言わんばかりに多彩な色の斑点で構成されていることが見て分かる。赤シートで隠れる色に設定したとしても、それに混ざっている赤シートで隠れない色の斑点が文字を浮かび上がらせてしまうのである。
斑点によって文字が認識できてしまうのなら、文字の周りの部分にも斑点が散らばっていればどこが文字なのかが分からなくなるはずという発想から、文字だけでなく背景にも色をつける方針に切り替えた。とはいえ、背景の色のチョイスもなかなか難しい。文字の色と対照的な色を使ってしまえば、むしろ文字の色が際立って赤シート越しに浮かび上がって見えてしまう。文字の色と似ている色を使ってしまえば、赤シートを外したときに文字が背景と同化して解読が難しくなる。
日本語 - 色の名前と色見本
↑このサイトを見ながら、文字色と同系色で、かつ文字を隠さないような微妙に文字色と異なる色を片っ端から試していったところ、画像のような組合せがベストだと発見した。

(…まあ過程はどうでもいいので)完成したannkiコマンドのソースコードを置いておく。
以下のテキストをコピーして、

  • プリアンブルにペーストする

もしくは

  • TeXにペースト→annkiという名前をつけ、拡張子をtexではなくstyに変更して保存→そのstyファイルを他のTeX関連パッケージと同じフォルダに置く→ファイルの場所を表すバーをクリック、cmdと入力、Enterでコマンドプロンプトが起動される→コマンドプロンプトにmktexlsrと入力、Enter→TeXに戻ってプリアンブルに\usepackage{annki}と入力

すれば、\annkiコマンドが使えるようになる。

\usepackage{color}
\definecolor{plyamabuki}{RGB}{255,163,19}%文字色の定義
\definecolor{usuiro}{RGB}{253,232,233}%背景色の定義
\newcommand{\annki}[1]{\colorbox{usuiro}{\textcolor{plyamabuki}{#1}}}%コマンドの定義

CTANから入手可能な化学パッケージの特色一覧【TeXで化学ノートを作りたい】

化学界でのTeX普及率は低く、TeXで化学文書を作ろうにも情報が少ない。
日本語の解説が無いのなら、自らの手で英語の解説を翻訳するのみである。

というわけで、まずは下記のページのリストに載っている化学パッケージのpackage documentationを読み漁ってみた。

CTAN: Chemistry

未来の自分自身、もしくはTeXで化学を表現したいという野望を抱く同士達の道標とするために、そこから読み取れた各パッケージの特色をざっくりまとめておく。

chemformula【高校化学ならこれで十分】
イオン式
組成式
・化学反応式(触媒を矢印の上に表示可能)
・電子式
・化学反応式を電子式で(電子配置を下に添えることも可能)

mhchem
イオン式
組成式
・化学反応式
・水素結合

chemfig【自由度MAXの構造式描画】
・やや面倒だがどんな構造式も書こうと思えばかける(価標を一本ずつ描くイメージ、結合角も指定可能)
・巻矢印
・電子式
・錯体の構造式

xymtex【大学有機化学の教科書をまるごと組版できそうな万能っぷり、IUPAC命名法の知識が身につく】
有機化合物の構造式ならほぼなんでも描ける
IUPAC名によく似たコマンド名
・イス型構造
・架橋
・縮合環(炭素に番号をつけてくれる機能つき)
・構造式の一部や原子に色をつけられる
・反応式の重要な箇所を色四角で囲める
・ハワース式
・ニューマン式
・錯体
・正四面体構造が一目で分かる図
・一つの化合物を違う視点から見た構造式が描ける
・高分子化合物
・各原子の所有電子→電子の共有→結合の形成という流れが分かる構造式
・電子式
・複数の環にABCD…という文字を入れて区別
ベンゼン環の様々な限界構造
・ヘリセン
・巻矢印を用いた反応機構や共鳴構造
・2本の半反応式を辺辺加えて反応式をつくる
・紙を積み重ねたようなオシャレな枠囲み

bpchem
・cis、transが自動でイタリック体になるコマンド
・ハプト数の記号が簡単に出力できるコマンド

chemmacros【物理化学にも配慮】
・酸解離定数などの記号
・丸囲み電荷
・δ電荷
IUPAC名の書体を自動で整えてくれるコマンド
・イタリックにすべき文字(指示水素etc.)を自動でイタリックにしてくれるコマンド
・RS表記の回転方向の矢印
・ハプト数の表示
・フィッチャー式のDLを自動で小さく表示してくれるコマンド
・熱化学方程式
理想気体の記号
同位体
・高分子化合物
・ニューマン投影式
・オービタル
・化学反応式
・酸化還元の矢印表示
・NMR
・エンタルピー

bohr
・ボーア模型による電子配置の図

carbohydrates
・(形にこだわらなければ)糖の構造式を簡単にかける

chemexec
・よく使うイオンを一発で出力
・丸囲みの+,-(形式電荷
・電子や陽子記号
・RS表記の回転方向の矢印

chemscheme
・e.g.やi.e.やetc.などをイタリックで表示してくれるコマンド

chemschemex
・円形(有機金属化学反応、生化学反応によくある、同じ反応をぐるぐる繰り返すタイプ)の反応式を描ける

chemstruct
ベンゼン環の限界構造式(ただしちょっと歪)
・金属錯体の構造式
・生体高分子化合物

elements
・電子配置の横書き表記(1s^2 2s^2…)を簡単に出力できる

endiagram
・化学反応のエネルギー変化のグラフ

ghsystem
・毒性・引火性などの警告マーク

lewis
・電子式を簡単に出力できる

mcf2graph
・手描きで描くときと同じ感覚で構造式を描ける(主観)
・usepackageしてすぐに使えるコマンド形式の命令ではないため、使える状態に至るまでの環境構築が結構大変

modiagram
分子軌道法ダイアグラム

mol2chemfig
・炭素に番号をつけた有機化合物構造式
・巻矢印

mychemistry【反応機構に特化】
・一つの化合物から多数の化合物ができる反応式
・構造式の大きさを簡単に変更
・色線で構造式を描く
・構造式や反応式を色つき四角で囲む
・巻矢印
・共鳴構造
・生化学反応
・光化学反応
・縦書きの反応式
カップリング反応

pst-labo
・化学実験の図(しかもカラーでめちゃくちゃ可愛い)

streetex
有機化合物のスペクトル
・炭素を・で表した構造式

texshade
・ゲノム

tikzorbital
分子軌道法ダイアグラム
・電子軌道や混成軌道の図

波動方程式との鮮烈な出会い

京大の振動波動論12回講義、圧倒的な神回だった

https://youtu.be/mbPBdsSqIwk

波動方程式ダランベールの解の性質を調べたときの『うわあ…コイツそのまま動いてるじゃんカタ:(ˊ◦ω◦ˋ):カタ』という感動は忘れられない

波動方程式の変数分離による解は波形を表し、ダランベールの解は速度の情報が含まれていることで波形の移動を表す…
つまりは振動も波動も波動方程式の解の別表現にすぎず、本質的には同一のものだということ。
定常波の振動のしかたを表す(変数分離による)解をダランベールの解として書き直すことで、定常波ができる過程まで数式から読み取ることができるなんて…

終始いろいろと発狂しながら視聴していた(※深夜です)
というかよく静かに聴いていられるな京大生…

極め付きは反射波の波形の導出。
物理基礎で描き方を習う固定端反射と自由端反射の波形、あれに関してずっと『どうしてこんなことがわかるのだろうか…じっくり観察した結果を模写しただけ?🤔』というモヤモヤが残っていたのだけど、…まさか波動方程式から計算で示すことができるとは。この世界は想像以上に整頓されていた。

いやー…とにかく最強の高校物理種明かし回。この感動を高校生に伝えられたらいいのだけど、なにせ数学の壁がね…この動画を(一部の独学狂を除く)高校生に薦めることは、英語を学んだことのない人をアメリカに強制留学させるようなものだ。

数学さえ分かれば自然科学界をそこそこ自由に遊び回ることができる。数学は切符。
そして今回もまた一つ、量子力学界への旅に必要な切符を手に入れられた気がする…

酸化数の規則に納得する

化合物中の原子の酸化数の合計が0になるというのは、エネルギー保存則ならぬ電荷保存則といえる。

誰かが手放した分は必ず誰かが貰っていないといけない。

たとえば合計が+1になってしまえば、化合物全体の所有電子が結合前より1個少ないということであるため、結合時に1個の電子がどこか宇宙の彼方へ飛んで行ってしまったことになる。
無論、こんなことは有り得ないので、電荷保存則は必ず満たすべき最優先規則。

Hを+1、Oを-2とする原則の下では、過酸化水素は酸化数の合計が-2になってしまう。
電荷保存則を満たすようにするには、Hを+2にするか、Oを-1にするかの修正が必要になる。
だが、Hは1個の電子しか所有していないため、2個の電子を失ったことを表す『酸化数+2』はありえない。
そこで、Oを-1にする。

  • - - - - - - - - - - - - - - - - ✄

保存則という考え方がこんなところで役立つとはな…
やはり自然科学を探索する者は物理学を学ばなければ始まらない。これからも頑張ります

微分法 学校で教えてくれないライプニッツ表記の基本

先日、知人から微分ライプニッツ表記に関する質問をいただき、この表記法を見直すとても良い機会となった。
素朴な疑問を抱かなくなってしまった数学人にとって、これほどためになる機会は存在しない。

そのときの解説資料を以下にまとめておく。

現在、微分法解説書を執筆している真っ最中だが、これをふまえてさらに加筆修正する予定。(草稿執筆段階で良質な質問をいただけたことは本当に幸運だ。もしも清書が終わった後だったら…orz)


f:id:nix_campane:20200727135910j:plain
『魔法をかけますよー』という合図の記号を演算子という。
演算子と何かをかけ算することは、その何かに魔法をかけることを意味する。
すなわち、演算子を『かける』ことで魔法を『かける』ことになる。日本語って秀逸ですね…

d/dxを左からかけられたものはxで微分される(微分という魔法がかかった)
d/dxを微分演算子という。

  • - - - - - - - - - - - - - - - - ✄

f:id:nix_campane:20200727135953j:plain
y=f(x)のとき、(d/dx)f(x)は(d/dx)yとも表せる。
このとき、yを分子に乗せて略記したものがdy/dxである。

このように、dy/dxのyは形式的にdとは独立のものとみなすことも可能である。(本来はひとかたまりのものではあるが)

  • - - - - - - - - - - - - - - - - ✄

f:id:nix_campane:20200727140018j:plain
d/dxを2回かけることは、指数の素朴な定義より、(d/dx)²をかけることとみなせる。
この意味で、2階微分はd²y/dx²と表される。

  • - - - - - - - - - - - - - - - - ✄

f:id:nix_campane:20200727140038j:plain
ここで注意すべきなのは、dxはひとかたまりのものでしかないという認識の下、(dx)²をdx²と略記しているということである。
決してdを1つ、xを2つかけたというわけではない。

  • - - - - - - - - - - - - - - - - ✄

f:id:nix_campane:20200727140057j:plain
以上のことをふまえると、写真のような変形が可能になる。
最後の式は、『dy/dx(xで微分して得た導関数)にさらに微分という魔法をかけた』ということを表す。
このように、2階微分とは『導関数微分すること』ともみなせる。
上の写真の式変形を瞬時に行うには、次のように考えればよい。
f:id:nix_campane:20200727140406j:plain

  • - - - - - - - - - - - - - - - - ✄

【発展事項】
f:id:nix_campane:20200727140117j:plain
『dy/dxは分数ではない』という言葉の真意は、次のようなものである。

・dyやdxは、本来ひとかたまりのものであるから、dとの積と考えてdを約分してはいけない。
・dy/dxは『dx分のdy』とは読まない。

この2点のみが重要なのであって、このことを『dy/dxは分数ではない』という言葉に含めてしまうことは適切ではない。
実際、dy/dx=f(x)の両辺にdxをかけて、dy=f(x)dxという表記をすることが大学数学ではよくある。理工学部であれば、微分方程式を解く際にこのような記法をよく用いる。このような表記を正当化する微分形式という数学の分野も存在する。(微分形式は、dy/dxというひとまとまりだけではなく、dyやdx単体にも意味をもたせようという分野である。)
そもそも、割線の傾きΔy/Δxにおいて、幅Δxを無限小にしたものがdy/dxであり、これが接線の傾きを表す以上、dy/dxはdyとdxの分数(比)なのである。…このことについては図解をつけて解説したものをClearに掲載したい。