我有一个创建试卷的包sujet.sty
,在这个包中我定义了一些命令,例如school
扩展到学校名称的命令。
\def\school{name-of-school}
我考虑过使用这个答案中定义的方法修改 .sty 文件?
,并且我创建了一个 sujetset.sty
包含这些命令的文件,包的用户必须修改此文件并输入他们的学校(和其他永久信息)。
为了简化用户打开和编辑包的过程,我考虑使用Kpathsea
这样的方式(命令行):
kpsewhich sujetset.sty
给出:
c:/texlive/texmf-local/tex/latex/local/sujet/sujetset.sty
然后我们需要在命令行中复制/粘贴它以打开sujetset.sty
进行修改。
我的目标是用一个命令来减少这两个操作,这可能吗?如果有人有其他更简单的方法,请帮忙。
答案1
如果您是 Emacs 用户,您可以将此代码添加到您的初始化文件中:
(defun LaTeX-find-sty-file ()
"find sty file whose name is under the point"
(interactive)
(let ((adr (shell-command-to-string (format "kpsewhich %s.sty" (thing-at-point 'symbol)))))
(if (string-empty-p adr)
(message "kpsewhich : no such package : %s.sty" (thing-at-point 'word))
(find-file (substring adr 0 -1)))))
(define-key LaTeX-mode-map (kbd "C-c y") 'LaTeX-find-sty-file)
接下来,假设 latex 模式,Cc y 打开名称位于点下的 sty 文件。
答案2
这是一个使用 的解决方案ba(s|tc)h
。
要加载sujetset.sty
文件,您可以使用texsrc sujetset
或texsrc sujetset.sty
。如果您未指定扩展名(实际上,如果未找到您提供的文件名),该函数将按此顺序尝试cls
、sty
和def
。如果找不到文件,该函数将尝试这些后备扩展名,但由于额外调用 ,这会减慢该过程的速度kpsewhich
。
您还可以传递第二个参数,该函数会尝试将其用作编辑器,因此会在中texsrc article nano
打开。article.cls
nano
两个版本本质上都是相同的代码(模块版本batch
是来自互联网的代码片段的拼贴 :-)。主要区别在于编辑器的选择:
版本
bash
检查是否$2
给出了;如果没有,则$EDITOR
使用默认值,否则它会在$2
with中搜索可执行文件which
,如果不存在则发出错误。如果没有给出编辑器且未$EDITOR
设置,则会引发另一个错误。batch
由于我缺乏知识,该版本无法测试可执行文件是否存在,因此它使用%EDITOR
如果已定义,或使用%2
如果给定,或使用notepad
因为。如果任何设置错误,就会造成混乱 :-)
以下是bash
版本:
function texsrc {
if [ $# -eq "0" ]; then
echo 'Use texsrc <package name>'
return 1
fi
tryfile=$(kpsewhich "$1")
if [ -n "$tryfile" ]; then
filetoload=$tryfile
else
for i in cls sty def; do
tryfile=$(kpsewhich "$1.$i")
if [ -n "$tryfile" ]; then
filetoload=$tryfile
break
fi
done
fi
if [ -z "$filetoload" ]; then
echo "No file found."
return 1
fi
if [ $# -eq "2" ]; then
if [ -z $(which $2) ]; then
echo I couldn''t find the editor $2
else
texed=$2
fi
else
texed=$EDITOR
fi
if [ -n "$texed" ]; then
eval $texed $filetoload
else
echo I Couldn''t find an appropriate editor to open the file: $filetoload
fi
}
和一个batch
版本:
@echo off
:texsrc
setlocal enabledelayedexpansion
if %1.==. goto ZeroArgs
call :SearchFile tryfile %1
if "%tryfile%"=="" (
for %%g in (cls,sty,def) do (
call :SearchFile tryfile "%1.%%g"
if defined tryfile (
set filetoload=!tryfile!
goto FileFound
)
)
) else (
set filetoload=%tryfile%
)
:FileFound
if "%filetoload%"=="" (
echo "No file found."
goto Return1
)
if defined EDITOR (set texed=%EDITOR%)
if not %2.==. (set texed=%2)
if not defined texed (set texed=notepad)
start "" %texed% %filetoload%
endlocal
exit /B 0
:SearchFile
setlocal
for /f "tokens=* usebackq" %%f in (`kpsewhich %2`) do (set _var=%%f)
endlocal & set %1=%_var%
exit /B 0
:ZeroArgs
echo Use texsrc ^<package name^>
goto Return1
:Return1
endlocal
exit /B 1
PS:不要直接编辑你的 TeX 安装文件:)
答案3
我在这里找到了解决方案
如何使用管道将一个命令的输出重定向到另一个命令的输入?
就我而言,我们在 Windows 命令提示符中需要的是:
for /F "tokens=*" %i in ('kpsewhich sujetset.sty') do %i
sujetset.sty
在默认 IDE 中打开文件。并使用批处理文件
@echo off
c:
cd \
for /f "delims=" %%i in ('kpsewhich sujetset.sty') do set exeLcn=%%i
start %exeLcn%