WSL에서 Windows font 사용하기 (feat. matplotlib font)
배경
Windows에 WSL(Windows Subsystem for Linux)이 추가되면서 즐겁게 사용하고 있다.
간혹 Linux에서 한글이 깨져 나타나지 않을 때가 있다. 나의 경우에는 R로 plot을 그릴 때 label에 있는 한글, 더 정확히는 non-ASCII 코드들이 깨져 표시되지 않는 경험이 있었다.
이 문제는 Linux(ubuntu) 자체에 이를 표현할 적당한 폰트(font)가 없기 때문이다. Linux에 적당한 font를 찾아 설치해주면 이 문제를 해결 할 수 있다.
하지만 WSL은 Windows와 한집살림을 하고 있는 형편이니 별도의 font 설치 없이 Windows의 font를 공유해서 쓸 수 있다.
방법1
아래와 같이 WSL에서 font 설정을 추가해 주면 windows에서 이미 제공하고 있는 font를 WSL에서도 사용할 수 있다.
/etc/fonts/local.conf
파일(이미 있다면 추가, 없다면 생성)에 아래와 같이 추가한다.
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<dir>/mnt/c/Windows/Fonts</dir>
</fontconfig>
/mnt/c/Windows/Fonts
는 windows filesystem에서 font를 저장하고 있는 폴더 위치인데, 다른 곳에 저장되어 있다면 자기에 맞는 경로로 바꾸어준다.
방법2
방법1로 font가 잘 인식되지 않을 때. 이유는 아직 잘 모르겠다. T.T Symbolic Link를 이용해 font folder를 연결시켜 준다.
mkdir -p /home/$USER/.local/share/fonts
ln -s /mnt/c/Windows/Fonts /home/$USER/.local/share/fonts/Windows_Fonts
ln -s /mnt/c/Users/$USER/AppData/Local/Microsoft/Windows/Fonts /home/$USER/.local/share/fonts/Windows_Local_Fonts
폰트 적용
새로 추가한 font를 시스템에 적용하기 위해 아래 명령을 실행시킨다.
fc-cache -r -v
# -f, --force scan directories with apparently valid caches
# -r, --really-force erase all existing caches, then rescan
# -s, --system-only scan system-wide directories only
# -y, --sysroot=SYSROOT prepend SYSROOT to all paths for scanning
# -v, --verbose display status information while busy
# -V, --version display font config version and exit
# -h, --help display this help and exit
석치된 폰트 리스트를 확인한다.
fc-list
Feat. matplotlib
OS 자체에 font는 설치되었지만, App 수준에서 인식을 안할 수가 있다. 이런 경우에는 App 설정을 살펴보아야 한다. 경험상 R
에서의 경우에는 별다른 설정 없이도 문제가 해결되었지만 python
의 matplotlib
의 경우에는 별도의 설정이 필요했다. 아래 방법을 참고하자
import matplotlib.font_manager as font_manager
# 시스템에 설치된 ttf 폰트 전체 리스트. 여기에 있다면 일단 폰트는 시스템 상에서 인식되는 것이다.
font_list_system = font_manager.findSystemFonts(fontpaths=None, fontext='ttf')
# matplotlib에서는 아래 리스트에 있는 font만 인식한다. 여기에 없다면 system에 있어도 불러오지 않는다.
print( [f.name for f in font_manager.fontManager.ttflist] )
# 아래와 같이 ttflist를 추가해 준다.
for f in font_list_system:
font_manager.FontManager.addfont( font_manager.fontManager, f)
# 설치 확인. 이제 시스템 폰트가 추가 되었는지 확인한다.
print( [f.name for f in font_manager.fontManager.ttflist] )
마지막으로 해당 실행 파일에서 어떤 폰트를 사용할 것인지 설정해 주어야 한다.
import matplotlib.pyplot as plt
plt.rc('font', family='NanumGothic')