我想尝试一下 WinEdt,使用 Ubuntu 14.04 上的 wine windows 模拟器。我已经安装了 texlive 2015,并且运行正常。
程序安装正常,使用 wine 模拟器似乎运行良好,但编译失败。问题似乎是找不到我的 texlive 安装路径。可能还有一些我尚未意识到的障碍。我假设一个选项是将另一个 texlive 安装到 wine 环境中。
但是,我不太想将 texlive 安装到 wine 环境中,因为它太大了,而且似乎浪费系统资源。也许有使用某种硬链接或软链接的解决方案?
有人知道如何让 wine 访问我已经安装的 texlive 2015 吗?这有可能吗?还有其他需要注意的陷阱吗?
我尝试编写的文档:
\documentclass{article}
\begin{document}
Hello World
\end{document}
错误:
Error Launching Console Application PDFTeXify ... Command Line: pdflatex.exe --interaction=errorstopmode -- ... File not found.
答案1
恐怕在 Wine 中正确运行 TL 的唯一方法(如果可能)是将 Windows 二进制文件与 Linux 二进制文件一起安装。
总之,Wine 不会将 Linux 二进制文件视为可执行文件,Wine 也无法通过主机系统运行它们,因为它会隔离执行。一种可能的解决方法是在 Wine 内安装 Cygwin,但这将是一个相当繁重的工作流程。
正如我在评论中提到的,Wine 似乎从底层 Linux 会话中获取环境变量,但其中一些被特别省略了PATH
(这是有道理的,原因有二:(A)Wine 不关心非 Windows 可执行文件,并且(二)它会破坏隔离/沙盒功能)。
让我们在实践中看看:
[paulo@nineveh ~] $ wine cmd
Microsoft Windows 5.2.3790 (1.9.12)
Z:\home\paulo>set
_=/usr/bin/wine
ALLUSERSPROFILE=C:\users\Public
APPDATA=C:\users\paulo\Application Data
BASH_FUNC_module()=() { eval `/usr/bin/modulecmd bash $*`
}
BASH_FUNC_scl()=() { local CMD=$1;
if [ "$CMD" = "load" -o "$CMD" = "unload" ]; then
eval "module $@";
else
/usr/bin/scl "$@";
fi
}
CLIENTNAME=Console
COLORTERM=truecolor
CommonProgramFiles=C:\Program Files (x86)\Common Files
CommonProgramW6432=C:\Program Files\Common Files
COMPUTERNAME=nineveh
ComSpec=C:\windows\system32\cmd.exe
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
DESKTOP_SESSION=gnome
DISPLAY=:0
GDM_LANG=pt_BR.UTF-8
GDMSESSION=gnome
GJS_DEBUG_OUTPUT=stderr
GJS_DEBUG_TOPICS=JS ERROR;JS LOG
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
HISTCONTROL=ignoredups
HISTSIZE=1000
HOMEDRIVE=C:
HOMEPATH=\users\paulo
HOSTNAME=nineveh
KDEDIRS=/usr
LANG=pt_BR.UTF-8
LESSOPEN=||/usr/bin/lesspipe.sh %s
LOADEDMODULES=
LOCALAPPDATA=C:\users\paulo\Local Settings\Application Data
LOGNAME=paulo
LOGONSERVER=\\nineveh
LS_COLORS=rs=0:di=38;5;33:ln=38;5;51:mh=00:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=01;05;37;41:su=48;5;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21;38;5;15:ex=38;5;40:*.tar=38;5;9:*.tgz=38;5;9:*.arc=38;5;9:*.arj=38;5;9:*.taz=38;5;9:*.lha=38;5;9:*.lz4=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.tzo=38;5;9:*.t7z=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lrz=38;5;9:*.lz=38;5;9:*.lzo=38;5;9:*.xz=38;5;9:*.bz2=38;5;9:*.bz=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.war=38;5;9:*.ear=38;5;9:*.sar=38;5;9:*.rar=38;5;9:*.alz=38;5;9:*.ace=38;5;9:*.zoo=38;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.cab=38;5;9:*.jpg=38;5;13:*.jpeg=38;5;13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=38;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;13:*.pcx=38;5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.m2v=38;5;13:*.mkv=38;5;13:*.webm=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4v=38;5;13:*.mp4v=38;5;13:*.vob=38;5;13:*.qt=38;5;13:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*.rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:*.flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5;13:*.yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45:*.m4a=38;5;45:*.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;45:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.oga=38;5;45:*.opus=38;5;45:*.spx=38;5;45:*.xspf=38;5;45:
MAIL=/var/spool/mail/paulo
MODULEPATH=/etc/scl/modulefiles:/etc/scl/modulefiles:/usr/share/Modules/modulefiles:/etc/modulefiles:/usr/share/modulefiles
MODULESHOME=/usr/share/Modules
NUMBER_OF_PROCESSORS=2
OS=Windows_NT
PATH=C:\windows\system32;C:\windows;C:\windows\system32\wbem
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_ARCHITEW6432=AMD64
PROCESSOR_IDENTIFIER=AMD64 Family 6 Model 23 Stepping 10, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=170a
ProgramFiles=C:\Program Files (x86)
ProgramW6432=C:\Program Files
PROMPT=$P$G
SESSION_MANAGER=local/unix:@/tmp/.ICE-unix/1279,unix/unix:/tmp/.ICE-unix/1279
SESSIONNAME=Console
SHELL=/bin/bash
SHLVL=2
SSH_AUTH_SOCK=/run/user/1000/keyring/ssh
SystemDrive=c:
SYSTEMROOT=C:\windows
TEMP=C:\users\paulo\Temp
TERM=xterm-256color
TMP=C:\users\paulo\Temp
USER=paulo
USERDOMAIN=nineveh
USERNAME=paulo
USERPROFILE=C:\users\paulo
VTE_VERSION=4402
windir=C:\windows
WINDOWID=27262982
WINDOWPATH=2
WINELOADERNOEXEC=1
winsysdir=C:\windows\system32
XAUTHORITY=/run/user/1000/gdm/Xauthority
XDG_CURRENT_DESKTOP=GNOME
XDG_MENU_PREFIX=gnome-
XDG_RUNTIME_DIR=/run/user/1000
XDG_SEAT=seat0
XDG_SESSION_DESKTOP=gnome
XDG_SESSION_ID=1
XDG_SESSION_TYPE=x11
XDG_VTNR=2
XMODIFIERS=@im=ibus
Z:\home\paulo>
请注意,PATH
仅指 Wine 的系统目录。如果我尝试导出一个随机变量,则说ZZZ
:
[paulo@nineveh ~] $ ZZZ=quack wine cmd
Microsoft Windows 5.2.3790 (1.9.12)
Z:\home\paulo>set
_=/usr/bin/wine
ALLUSERSPROFILE=C:\users\Public
APPDATA=C:\users\paulo\Application Data
...
XDG_VTNR=2
XMODIFIERS=@im=ibus
ZZZ=quack
Z:\home\paulo>
请注意,这ZZZ
已导出到 Wine。现在让我们检查二进制文件和其他内容:
// quack.c
#include <stdio.h>
int main(void) {
printf("quack!\n");
return 0;
}
我将生成两个二进制文件quack1
(用于 Linux)和quack2.exe
(用于 Windows):
[paulo@nineveh ~] $ gcc -Wall quack.c -o quack1
[paulo@nineveh ~] $ i686-w64-mingw32-gcc -Wall quack.c -o quack2.exe
[paulo@nineveh ~] $ ls -lha quack*
-rwxrwxr-x. 1 paulo paulo 8,5K Jul 11 08:57 quack1
-rwxrwxr-x. 1 paulo paulo 78K Jul 11 08:57 quack2.exe
-rw-rw-r--. 1 paulo paulo 84 Jul 11 08:56 quack.c
现在,让我们检查生成的可执行文件:
[paulo@nineveh ~] $ file quack1
quack1: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=98adf48a7a9d9c2f0bdf5c96e62270e76e5c45a3, not stripped
[paulo@nineveh ~] $ file quack2.exe
quack2.exe: PE32 executable (console) Intel 80386, for MS Windows
运行两个文件:
[paulo@nineveh ~] $ ./quack1
quack!
[paulo@nineveh ~] $ ./quack2.exe
fixme:winediag:start_process Wine Staging 1.9.12 is a testing version containing experimental patches.
fixme:winediag:start_process Please mention your exact version when filing bug reports on winehq.org.
quack!
请注意,第二个文件 ( quack2.exe
) 由 Wine 在后台执行,因为它不是本机二进制文件。现在,让我们转到 Wine:
[paulo@nineveh ~] $ wine cmd
Microsoft Windows 5.2.3790 (1.9.12)
Z:\home\paulo>dir quack*
O volume na unidade Z não tem rótulo.
Número de Série do Volume é 0000-0000
Directory of Z:\home\paulo
11/7/2016 08:56 84 quack.c
11/7/2016 08:57 8,624 quack1
11/7/2016 08:57 79,150 quack2.exe
3 files 87,858 bytes
0 directories 437,039,472,640 bytes free
Z:\home\paulo>
现在,让我们运行这两个文件:
Z:\home\paulo>quack1
Não é possível reconhecer 'quack1' como um comando interno, externo ou arquivo de lotes.
Z:\home\paulo>quack2
quack!
(抱歉,信息是用葡萄牙语发送的)
观察到 Linux 可执行文件未被识别,而 Windows 可执行文件则被正确执行。现在,让我们检查一下变量PATHEXT
:
Z:\home\paulo>echo %PATHEXT%
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
这些是 Wine/Windows 识别为可执行文件的文件扩展名。
出于好奇,我决定复制quack1
到quack3.exe
Wine 看看里面发生了什么。首先要做的事情是:
[paulo@nineveh ~] $ file quack3.exe
quack3.exe: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=98adf48a7a9d9c2f0bdf5c96e62270e76e5c45a3, not stripped
然后:
[paulo@nineveh ~] $ wine cmd
Microsoft Windows 5.2.3790 (1.9.12)
Z:\home\paulo>quack3
quack!
该文件已执行!由于 Wine 是一个模拟层,因此如果将其伪装成 Windows 二进制文件,它似乎也能理解 Linux 二进制文件,但这当然是一种卑鄙的手段,永远不应该使用。
我有以下建议:(A)尝试在 Wine 中安装 TL(不确定是否可行),(二)设置一个装有普通 Windows 安装(可能是 Windows XP)的虚拟机,并在其中安装 TL,或者(C)在 Wine 内安装 Cygwin 并观察接下来会发生什么。:)
另外,请注意,上面使用的可执行示例非常简单,没有使用很多共享库,因此上面有效的方法在实际可执行文件中可能会失败。我的测试非常简单,就像鸭子一样。:)
希望这个答案能给你一些关于如何解决这个问题的提示。就我个人而言,我不会使用 Wine 来解决此问题,因为它只是一个模拟层。我更喜欢一个强大的解决方案,在虚拟机中使用正确的 Windows 安装。:)
附录:David 在聊天室中提到,TeX Live 中的格式和配置是跨平台的,因此理论上您只需要 Windows 二进制文件并共享其他所有内容,但这可能不值得。