TeXStudio for Windows の設定(自分用メモ)

■目標:platex で作った文書を扱う.

■コマンドの編集
[オプション(O)]>[TeXStudioの設定(C)]を選んで設定パネルを表示する.
必要ならば左のカラムで「コマンド」を選び,右のカラムのコマンドを編集してゆく:
・LaTeX
(old)latex.exe -src -interaction=nonstopmode %.tex
(new)platex.exe -no-guess-input-enc -kanji=utf8 -synctex=1 -interaction=nonstopmode %.tex
・BibTeX
(old)bibtex.exe %
(new)upbibtex.exe %
・Biber
(old)biber.exe %
(new)biber.exe --bblencoding=utf8 -u -U --output_safechars%

texstudiosetting001+

■ビルドの編集
左のカラムで「ビルド」を選び,次のように編集する:
texstudioBuildSetting

参考にしたページ:
TeXstudio/設定/Windows

広告

WSLからevinceを使う方法

Windowsでevinceを使いたい人からの検索流入があるのでこの記事を書いた.
(MSYS2ではなく)WSLから $ evince と呼んで使えるようにする方法を書いておく.

■ step1. evinceのインストール
$ sudo apt install evince

インストール後に evince を起動しようとするとこうなる:
$ Unable to init server: Could not connect: Connection refused
Cannot parse arguments: Cannot open display:

いわゆるX環境が不足しているようだ.

■ step2. Xming X Server for Windows のインストール

X Server for Windows のページに書いてあるとおりにインストールすればよい.ダウンロードページに行きXming-*-setup.exe をダウンロードし,そのままダブルクリックして「Next」をどんどん選んで行けばインストールが完了する.

■ step3. WindowsからXmingを検索し,右クリックして「タスクバーにピン留め」しておく.
■ step4. X11を使うための設定
~/.bashrc に次のような行を加える:
export DISPLAY=localhost:0.0
変更を保存したら一度 WSLを終了する.

■ step5. evinceを使う.
$ evince myPDF.pdf & したときに「Unable to init server:」と言われたらタスクバー上のXmingをクリックしてからもう一度実行すればよい.evinceが立ち上がった場合,
(evince:18): GLib-GIO-CRITICAL **: 10:56:55.137: g_dbus_proxy_new_sync: assertion ‘G_IS_DBUS_CONNECTION (connection)’ failed
という警告が出てくるが,いまのところ無視している.

参考にした記事
俺の Bash on Windows10 環境

LyXで日本語を使うようにする設定(Windows)

LyXというのは,texなど(latex, luatex, and so on)をWYSIWIGスタイルで扱うためのラッパーだと思ってください.Wordの数式エディタのような調子で編集し,しかもtexならではのシュッとしたPDFを生成できるというすぐれものです.

便利なのは良いのですが,数式の入った日本語文書を作ろうとすると,Windows版では「ただ動かす」だけでも多少の自明でない設定が必要となります.諸般の事情によりLyX環境を整備するのが二回目となるのでメモ代わりに記事とします.

前提:
1. texlive などのlatex環境がすでに整っている.
2. バイナリはここから取ってきてインストールが済んでいる.

■latexの設定
[ツール(T)] > [設定(P)…] で「出力」「LaTeX」を次のように設定する:
lyx設定出力LaTeX
設定したら[適用(A)] > [保存(S)] をクリックして設定を反映させる.

■言語の設定
日本語の文書を作成する場合は babel を off にする.
[ツール(T)] > [設定(P)…] で「言語設定」「言語」を選んで次のように設定する:
lyx設定言語設定-言語

■文書-文書クラスの設定
[文書(D)] > [設定(S)…] で「文書クラス」を選んで次のように設定する:
lyx文書の設定-文書クラス

■文書-言語の設定
[文書(D)] > [設定(S)…] で「言語」を選んで次のように設定する:
lyx文書の設定-言語New
設定したら「文書の既定値として保存」して[適用(A)]>[OK]する.

■文書-形式の設定
[文書(D)] > [設定(S)…] で「形式」を選んで次のように設定する:
lyx文書形式

設定したら「文書の既定値として保存」して[適用(A)]>[OK]する.

■変換子の設定
[ツール(T)] > [設定(P)…] で「ファイル処理」「変換子」を次のように設定する:

●LaTeX (luaTeX) -> PDF
lyx設定ファイル処理変換子LaTeX2PDF

設定したら[修正(M)]を押してから[適用(A)] > [保存(S)] をクリックして設定を反映させる.

●DVI -> PDF(dvipdfm)
lyx設定ファイル処理変換子DVI2PDF

設定したら[修正(M)]を押してから[適用(A)] > [保存(S)] をクリックして設定を反映させる.

●LaTeX(pLaTeX) -> DVI
lyx設定ファイル処理変換子Platex2DVI

設定したら[修正(M)]を押してから[適用(A)] > [保存(S)] をクリックして設定を反映させる.

■ファイル形式の設定
ここではビューワとしてtexworksを指定している.
lyx設定ファイル形式
設定したら[適用(A)] > [保存(S)] をクリックして設定を反映させる.

参考にしたサイト
TeX Wiki LyX/設定/Windows

■履歴
2018/10/24 初稿作成
2018/10/30 若干修正
2018/10/31 さらに修正
2018/11/03 さらに修正

git for Windows のhomeを好きな場所に設定する

git for Windows の home を F:\WSLHOME に設定してみよう.

1. Git for Windows のサイトに行ってインストーラをDLする.

2. (オプション)インストール時にはなるべくこのようにしたほうが良いと思う:
gitbashInst1

3. $HOME を設定する.「PC」を右クリックして「プロパティ」→ 「システムの詳細設定」で「環境変数」を選ぶ.

次にユーザー環境変数を新しく作る.「新規(N)」を押して
変数名:HOME
変数値:F:\WSLHOME
としてやる.OKしてコントロールパネルを閉じる.

参考にした記事:
Git for Windows tip: Setting $HOME and the startup directory

WSLで blas と lapack (自分用メモ)

blas とか lapack はちょっと高度な科学技術計算には必須のもので,MSYS2に入れるのが不可能である[要出典]ことが知られています[誰によって?].そこでWSLです.Ubuntuならば

$sudo apt-get update
$sudo apt install pkg-config
$sudo apt install libgsl0-dev liblapack-dev libatlas-base-dev

※事情があってこのブログからコピペできない人のために補足すると’libgsl0’の末尾二文字は「エルの小文字」「数字のゼロ」です.

多分こんな感じでいけるはず[曖昧な語尾].

(a)WSLをCドライブ以外の場所に置き,(b)homeも別の場所に置いて,(c)chmodも使えるようにする方法.(自分用メモ)

Windows 再インストールした結果としてWSL環境を作り直すことになった.せっかくなので次の(a)(b)(c)をやってみた:

(a) Cドライブ以外の場所にWSLを置き直すことにした.(Cドライブ以外の場所に置きたいのは,開発にともなってディスクの書き換えが頻繁に起こるからである).

(b) WSLのホームディレクトリをなるべく浅いところに置いた.(たとえばホームディレクトリ以下で生成したファイルなどを取り出す場合,ホームディレクトリがわかりやすい場所にあると楽だ.)

(c) chmod できるようにする.デフォルトではWSLではchmodが無視される.このことにより問題が起こる場合もあるのでここを改善する.

1. Fドライブ(でもなんでも)直下に WindowsSubsystemForLinux と WSLHOME というフォルダを作っておく.WindowsSubsystemForLinux にWSLが置かれる予定である.WSLHOMEが将来WSLのホームディレクトリになる.

2. WSLを入れる準備を行う.Power Shell を管理者権限で開き,次のように入力する:

PS C:\Users\Henrik> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

再起動を要求されるのでそれに従う.

3. Microsoft Storeを開き,linux で検索すると色々候補がでる.ここでは Ubuntu 18.04LTS を選んだ前提で話を進める.Ubuntu@WSL を初回起動し username/password を入れておく.以下では username = konrad とする.その後 exit して Ubuntu を終了する.

4. Power Shell を管理者として実行する.(しばらくPower Shell での作業が続く).
まずchocolatelyを入れる:

PS C:\Users\Henrik> Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

次にlxrunofflineを入れる:

PS C:\Users\Henrik> choco install lxrunoffline

質問されたら y で答えてインストールを完了し exit する.

5. 再び Power Shell を管理者権限で起動する
念のためユーザ名を確認しておく:

PS C:\Users\Henrik> whoami
desktop\henrik

すなわちユーザ名は henrik であることが確認できた.(この「henrik」の箇所は各自読み替えてほしい).次にFドライブ直下のWindowsSubsystemForLinux フォルダに書き込み権限を与える:

PS C:\Users\Henrik> icacls F:\WindowsSubsystemForLinux /grant "henrik:(OI)(CI)(F)"
処理ファイル: F:\WindowsSubsystemForLinux
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした
PS C:\Windows\system32>

次に

PS C:\Users\Henrik> lxrunoffline move -n Ubuntu-18.04 -d f:\WindowsSubsystemForLinux

する.確かに移動ができたことを確認しておく:

PS C:\Windows\system32> lxrunoffline get-dir -n Ubuntu-18.04
f:\WindowsSubsystemForLinux

以上でWSLがFドライブに置かれるようになった.

6. homeの移動.Ubuntu@WSL から

$ cd ~
$ cp -p .* /mnt/f/WSLHOME/

のようにして、「.bash_logout」、「.bashrc」、「.profile」などをなるべくそのまま(-p オプション)コピーしておく.

7. Ubuntu@WSL から
$ sudo vi /etc/passwd
して最後の方の行

konrad:x:1000:1000:"",,,:/home/konrad:/bin/bash

konrad:x:1000:1000:"",,,:/mnt/f/WSLHOME:/bin/bash

と変更し,:wqする.$ exitして一度WSLを終了する.

8. ふたたびWSLを起動して Ubuntu@WSL で

konrad@DESKTOP:~$ cd;pwd
/mnt/f/WSLHOME

となっていればよい.

9. chmod 対応.まず,/etc/wsl.conf というファイルを必要ならば作る:
$sudo touch /etc/wsl.conf
$sudo vim /etc/wsl.confのようにして編集する.
(case1)もし空ファイルだったら 

[automount]
options = "metadata"

のように書いて保存する.
(case2)もしすでに

[automount]
options = "foo"

という行があったら

[automount]
options = "metadata, foo"

のように修正し,保存する.

10. その他(git の設定)
改行コードを変更しないようにする.
$ git config --global core.autocrlf input

参考にした記事:
Can I move the linux subsystem to a different drive?
Bash on Windowsのホームディレクトリ変更
WSLからマウントしたWindowsのドライブでchmodしたい

MSYS2 上で stack upgrade (Haskell)

使っていたstackのバージョンが1.7.0.1だったのでバージョンを上げようと思った.そこで MSYS2 上で $stack upgrade したがパーミッションの問題でうまくいかない.
「管理者として実行」でMSYS2シェルを立ち上げて$stack upgradeしてもうまくいかない.

$stack upgrade を実行したときの最後のメッセージが

Should I try to perform the file copy using sudo? This may fail
Try using sudo? (y/n) y
Going to run the following commands:

-  sudo cp C:\Users\Username\AppData\Roaming\local\bin\stack.exe C:\stack-1.7.0.1-windows-x86_64\stack.exe.tmp
-  sudo mv D:\stack-1.7.0.1-windows-x86_64\stack.exe.tmp D:\stack-1.7.0.1-windows-x86_64\stack.exe

だったので,「管理者として実行」でMSYS2シェルを立ち上げてから

$ cp "C:\Users\Username\AppData\Roaming\local\bin\stack.exe" "C:\stack-1.7.0.1-windows-x86_64\stack.exe.tmp"
$ mv "D:\stack-1.7.0.1-windows-x86_64\stack.exe.tmp" "D:\stack-1.7.0.1-windows-x86_64\stack.exe"

したらうまくいったようだ:

$ stack --version
Version 1.7.1, Git revision 681c800873816c022739ca7ed14755e85a579565 (5807 commits) x86_64 hpack-0.28.2

Haskellによる日本語テキスト処理(Windows上で)

Haskellでテキストを処理しようとするとき,このように書きたくなるであろう:

-- テキストをHTMLに変換する
module Main where

import System.Environment(getArgs)

htmlEncode :: String -> String
htmlEncode [] = []
htmlEncode (c:cs) = (f c) ++ htmlEncode cs
  where
    f :: Char -> String
    f '' = ">"
    f '&' = "&"
    f '"' = """
    f a = [a]

main :: IO ()
main = do
  [inputF, outputF] <- getArgs  :: IO [String]
  inputText <- readFile inputF
  let outText = unlines $ htmlEncode  (lines inputText) :: String
  writeFile outputF outText

上のプログラムをWindows上で日本語(utf-8)が含まれたテキストを処理することを考える:
$ stack exec converter -- app/Main.hs main.htm
すると「 hGetContents: invalid argument (invalid byte sequence)」というようなことを言われてうまく処理できなかった.テキストがShift-JISとして読まれているためにこうなるらしい(よく理解できていない).

ロケールを変更すると良いらしいのだが方法がよくわからなかったので次のようにプログラム側で対処した:

-- テキストをHTMLに変換する
module Main where

import System.Environment(getArgs)
import System.IO (IOMode (..), hGetContents, hSetEncoding, openFile, hPutStr, hClose)
import GHC.IO.Encoding (utf8)

htmlEncode :: String -> String
htmlEncode [] = []
htmlEncode (c:cs) = (f c) ++ htmlEncode cs
  where
    f :: Char -> String
    f '' = ">"
    f '&' = "&"
    f '"' = """
    f a = [a]

main :: IO ()
main = do
  [inputF, outputF] <- getArgs  :: IO [String]
  handle <- openFile inputF ReadMode
  hSetEncoding handle utf8
  inputText <- hGetContents handle :: IO String
  let outText = unlines $ htmlEncode  (lines inputText) :: String
  ohandle <- openFile outputF WriteMode
  hSetEncoding ohandle utf8
  hPutStr ohandle outText
  hClose ohandle

optparse-genericを使ったバージョンは:

-- テキストをHTMLに変換する
{-# OPTIONS_GHC -Wall -fwarn-tabs #-}
{-# LANGUAGE DataKinds            #-}
{-# LANGUAGE DeriveGeneric        #-}
{-# LANGUAGE FlexibleInstances    #-}
{-# LANGUAGE OverloadedStrings    #-}
{-# LANGUAGE StandaloneDeriving   #-}
{-# LANGUAGE TypeOperators        #-}

module Main where

import System.IO (IOMode (..), hGetContents, hSetEncoding, openFile, hPutStr, hClose)
import GHC.IO.Encoding (utf8)
import Options.Generic --stack install optparse-generic

data OptionInput  w = OptionInput
  { rawtext :: w ::: String           "raw text file to be transformed"
  , htmlout :: w ::: String           "HTML output file"
  } deriving (Generic)

instance ParseRecord (OptionInput Wrapped)
deriving instance Show (OptionInput Unwrapped)

htmlEncode :: String -> String
htmlEncode [] = []
htmlEncode (c:cs) = (f c) ++ htmlEncode cs
  where
    f :: Char -> String
    f '' = ">"
    f '&' = "&"
    f '"' = """
    f a = [a]

main :: IO ()
main = do
  x  html"
  let
    inputF = rawtext x :: String
    outputF = htmlout x :: String
  handle <- openFile inputF ReadMode
  hSetEncoding handle utf8
  inputText <- hGetContents handle :: IO String
  let outText = unlines $ htmlEncode  (lines inputText) :: String
  ohandle <- openFile outputF WriteMode
  hSetEncoding ohandle utf8
  hPutStr ohandle outText
  hClose ohandle

参考にした記事:WindowsでHaskellを扱う時によく遭遇するエラーと対処法

Cドライブの交換(作業メモ)

■要約:「KURO-DACHI/CLONE/U3」とAOMEI Partition Assistant でCドライブの交換を楽にすませた.1000円ぐらいのSSD用外付けケースもあると便利.

ずっと使っているパソコンのCドライブが300GBで手狭になってきたので交換することにした.
交換先として2TBのSSD(SanDisk Ultra | 3D SSD)を買った.SSDと一緒に玄人志向「KURO-DACHI/CLONE/U3」(以下では「KURO」と略す)というのを買った.

この「KURO」には3.5inchのHDD二台を同時に差し込むことができる.電源だけ入れて(USBでパソコンにつないでいない状態)「clone」というスイッチを押すだけで簡単にHDD1からHDD2にまるごとコピーできるというのが売りらしい.以前DドライブをバックアップしたときにはUbuntuを使って面倒な作業をしたけれど,これなら疲れていて集中力が落ちていても失敗しないだろうと考えた.

■「この手順でやればよかったな」というコピーの流れ:
1.自分のCドライブがMBRなのかGPTなのか確認する.(「mbr gpt 確認」でググってほしい).忘れないようにメモしておく.少し古いPCだと大抵MBRだと思う.
2.新品のSSDを外付け用ケースに入れてPCに接続し,自分のPCに合わせて MBR, NTFSで初期化する.
3.古い300GBのSSDを「KURO」の「HDD1」に,新しく買った2TBのSSDを「HDD2」に挿入し,「KURO」の電源を入れる.そして小さな「clone」というボタンを押す.正面四つのランプが左右に行き来する感じにオレンジ色に点滅する.
4.コピーが完了(四つのランプが同時に点滅を繰り返す状態)したら「KURO」の電源を切って2TBのSSDをPCにつなぎ,起動する.

■実際に試行錯誤しながらやったコピー作業:
1.メインPCの電源を切り,電源を抜く.
2.PCの筐体を開け,CドライブSSDを取り出す.(ドライバが必要になる作業)
3.古い300GBのSSDを「KURO」の「HDD1」に,新しく買った2TBのSSDを「HDD2」に挿入し,「KURO」の電源を入れる.そして小さな「clone」というボタンを押す.

これでコピーが始まるはずだったのだが,データの転送を示すLEDの点滅が始まらない.

なんらかの方法でSSDを初期化しないといけなかったらしい.(他の人が書いた体験記などを読むとどうも初期化なんかいらないというようなことも書いてある.こちらの条件と何が違うのかよくわからない.なにか私が読み落としたのかもしれない).それはともかく,私がやったのは:

4.2TBのSSDを「KURO」から取り出し,簡単な(1000円ぐらいの)ケースに入れてノートPC(メインじゃない方)に接続した.そして「Windowsマークを右クリック –> ディスクの管理」を開いてSSDをMBR,NTFSで初期化した.(これは自分の古いPCに合わせた.自分のCドライブがMBRなのかGPTなのかは前もって確認しておく必要がある).

5.2TBのSSDを再び「KURO」に戻し,「copy」ボタンを押した.するとコピーが始まった.数十分でコピーは完了する.(正面四つのランプが同期してオレンジ色に点滅し続けるのが完了の合図).
6.「KURO」の電源を切り,2TB SSD をメインPCに刺し,全てのケーブルを元通りにつなぐ.
7.メインPCの電源をつなぎ,起動テストする.

何事もなく「Resume From Hibernation」と表示されたのを見て「この子自分の脳が交換されたのに気づいてないんだろうな」と思ってちょっと面白かった.

■コピー後の作業:
さて,「KURO」の「丸ごとコピー」では全てがそのままコピーされるので,新しいCドライブも300GBまでしか認識されていない.「Windowsマークを右クリック –> ディスクの管理」を通じてその様子が確認できる.

System Reserved | Windows (C:) | 回復パーティション | 未割当て(1.5TB)

のようになっており,ここの未割当の1.5TBを割り当てても,間の「回復パーティション」で隔てられていてCドライブを大きくすることができない.「回復パーティション 移動」で検索し,AOMEI Partition Assistant の無料バージョンでパーティションの移動を行った.GUIですっとパーティションを動かして「確定」するだけで作業が完了するので衝撃を受けた.

32ビット?64ビット?(自分用メモ)

■gccが32ビットか64ビットか:
gcc -v の出力の Target: のところを見る.

32ビットの場合 Target: mingw32
64ビットの場合 Target: x86_64-pc-msys

などのようになる.システムの細かな差異によって文字列は少しずつ違うが,64ビットの場合 x86_64 が部分文字列としてしばしば含まれる.

■ghcが32ビットか64ビットか:
次のようなファイルを作る:

main = print ()

そして

$ ghc --make foo.hs
[1 of 1] Compiling Main             ( foo.hs, foo.o )
Linking foo.exe ...

$ file foo.exe

32ビットの場合には
PE32 executable (console) Intel 80386, for MS Windows

64ビットの場合には 
PE32+ executable (console) x86-64, for MS Windows

のようになる.

■おまけ:
自分がどの gcc を使ってるのかわからなくなった場合などは
which -a gcc
すればよい.使い分けをしたい場合は適宜 .bashrc に alias を張ればよさそう.